28P by neo 27일전 | favorite | 댓글 2개
  • 클라이언트 측 DB로, Notion이나 Figma와 같은 실시간 협업 앱을 쉽게 구축할 수 있게 해줌
  • 관계형 쿼리를 작성하면 Instant가 데이터 가져오기, 권한 확인, 오프라인 캐싱을 처리
  • 데이터 변경 시 Optimistic 업데이트와 롤백도 자동으로 처리
  • 모든 쿼리는 기본적으로 멀티플레이어로 지원
  • 커서나 온라인 상태와 같은 일시적 업데이트도 지원
  • 현재 Javascript, React, React Native용 SDK를 제공

개발 동기

  • 현대 앱 개발은 서버 설정, 데이터베이스, 캐시, ORM, 엔드포인트 설정 등 많은 작업이 필요함
  • 클라이언트 측 코드 작성, 상태 관리, UI 페인팅도 필요함
  • 멀티플레이어 기능 추가 시 상태 저장 서버를 고려해야 하고, 오프라인 모드 지원 시 IndexedDB와 트랜잭션 큐를 고려해야 함
  • 새로운 기능 추가 시마다 모델, 엔드포인트, 상태 관리, UI를 반복적으로 작성해야 함
  • 2021년에 UI 엔지니어가 직면하는 대부분의 문제는 사실 데이터베이스 문제임을 깨달음
  • 클라이언트 측 데이터베이스가 있다면 상태 관리, 엔드포인트, 로컬 캐시를 생각할 필요 없이 쿼리만 작성하면 됨
  • 쿼리가 기본적으로 멀티플레이어를 지원하면 상태 저장 서버를 걱정할 필요 없음
  • 데이터베이스가 롤백을 지원하면 낙관적 업데이트를 무료로 제공받을 수 있음
  • 그래서 Instant를 개발함. Instant는 클라이언트에서 사용할 수 있는 데이터베이스를 제공하여 UX 구축에 집중할 수 있게 해줌

아키텍처 개요

  • Instant는 모든 사용자 데이터를 하나의 큰 Postgres 데이터베이스에 트리플 형태로 저장함
  • 멀티 테넌트 설정으로 무료 티어를 제공함
  • Clojure로 작성된 동기화 서버가 Postgres와 통신함
  • Datalog와 GraphQL과 유사한 InstaQL을 이해하는 쿼리 엔진을 작성함
  • Asana의 WorldStore와 Figma의 LiveGraph에서 영감을 받아 Postgres의 WAL을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화함
  • 프론트엔드에서는 클라이언트 측 트리플 스토어를 작성함
  • SDK는 웹에서는 IndexedDB, React Native에서는 AsyncStorage에 최근 쿼리 캐시를 저장함
  • 모든 데이터는 Google's CEL 라이브러리로 구동되는 권한 시스템을 통해 처리됨

GN⁺의 정리

  • Instant는 클라이언트 측 데이터베이스로, 실시간 협업 앱을 쉽게 구축할 수 있게 해줌
  • 관계형 쿼리를 통해 데이터 가져오기, 권한 확인, 오프라인 캐싱을 자동으로 처리함
  • 멀티플레이어 기능과 낙관적 업데이트, 롤백을 기본적으로 지원함
  • Asana와 Figma에서 영감을 받아 Postgres의 WAL을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화함
  • 클라이언트 측 트리플 스토어와 권한 시스템을 통해 데이터 관리를 효율적으로 처리함

Supabase와 같은 결에서 정말 기대되는 프로젝트네요

Hacker News 의견
  • Firebase 창립자: Instant의 오프라인, 실시간, 관계형 쿼리, 오픈 소스 조합에 흥분됨. 관계형 쿼리에 대한 요청이 많았음. Firebase 클라이언트는 오픈 소스지만 백엔드는 오픈 소스화 실패했음

  • 피드백: 코드 예제가 완전하지 않음. transactuseQuery의 출처가 명확하지 않음. 작은 디테일이 중요함

  • 자체 호스팅 가능 여부: 도구의 일부가 자체 호스팅 불가능한 경우가 많음. 이를 명확히 해야 함

  • 오프라인 우선 모델 대안: PowerSync를 선택했음. WatermelonDB도 괜찮음. ElectricSQL은 아직 미성숙함. CouchDB와 PocketDB는 최신이 아님. PowerSync와 Supabase를 백엔드로 사용할 예정임

  • CRUD 앱과의 관계: CRUD 앱과 InstantDB 또는 Firebase 개념의 관계를 이해하기 어려움. 협업 텍스트 편집기에는 CRDT Javascript 구현을 사용할 것임

  • Instant 사용 경험: 6개월 동안 Instant를 사용했으며 만족스러웠음. 실시간, 관계형, 오프라인 기능이 중요했음. 다른 도구를 시도했지만 실패했음. Instant 이후로는 다른 도구를 사용하지 않음

  • 권한 시스템 요약: Firebase는 데이터 검색/업데이트 논리와 접근 정책을 분리함. Instant는 쿼리 결과에 따라 권한 논리를 평가함. Firebase는 쿼리 실행 전에 안전성을 확인함

  • Datalog 엔진 노출 여부: 재귀 쿼리를 지원하는 다른 Datalog 엔진이 있음. 쿼리 캐시 및 결합 가능 여부를 묻고 있음. 과거 Java InstantDB와 이름이 같음. Clojure로 구현된 다른 Datalog 엔진 목록을 제공함

    • Datomic
    • XTDB
    • Datascript
    • Datalevin
    • datahike
    • Naga
  • ActiveRecord 같은 경험 원함: React/Vue/Solid에서 ActiveRecord와 같은 방식으로 작업하고 싶음. 객체 그래프 같은 API를 원함. SQL 같은 API는 원하지 않음. ORM이 메모리에 전체 객체 그래프가 있는 것처럼 작동하길 원함

  • 트리플 스토어 성능 문제: 대부분의 쿼리가 전체 객체 또는 동일 객체의 여러 필드를 가져올 때 트리플 스토어의 성능이 좋지 않음. Postgres도 그다지 뛰어나지 않음. 이와 관련된 경험을 묻고 있음