架构设计
Supabase 是开源的。我们选择可扩展的开源工具,并使其简单易用。
Supabase 并非 Firebase 的一对一映射。虽然我们正在构建 Firebase 提供的许多功能,但实现方式截然不同: 我们的技术选择大相径庭;我们使用的所有工具都是开源的;在可能的情况下,我们优先采用和支持现有工具而非从头开发。
最显著的区别是,我们使用 Postgres 而非 NoSQL 数据库。这一选择是经过深思熟虑的。我们相信没有其他数据库能在提供与 Firebase 竞争的功能的同时,保持超越其规模的扩展能力。
选择适合您的使用方式
Supabase 的目标是让 Postgres 的 所有 功能都易于使用。但这并不意味着您必须使用全部功能。如果您是 Postgres 资深用户,您可能会喜欢我们提供的工具。如果您从未使用过 Postgres,可以从简单功能开始逐步深入。如果您只想把 Postgres 当作简单的表存储,也完全没问题。
架构
每个 Supabase 项目由多个工具组成:
Postgres (数据库)
Postgres 是 Supabase 的核心。我们不会对 Postgres 数据库进行抽象封装——您可以完全权限访问和使用它。我们提供的工具让 Postgres 变得像 Firebase 一样易用。
- 官方文档: postgresql.org/docs
- 源代码: github.com/postgres/postgres (镜像)
- 许可证: PostgreSQL 许可证
- 开发语言: C
Studio (控制面板)
一个用于管理数据库和服务的开源仪表盘。
- 官方文档: Supabase 文档
- 源代码: github.com/supabase/supabase
- 许可证: Apache 2
- 开发语言: TypeScript
GoTrue (认证)
基于 JWT 的用户管理和访问令牌签发 API。该系统与 PostgreSQL 的行级安全功能和 API 服务器集成。
- 官方文档: Supabase Auth 参考文档
- 源代码: github.com/supabase/gotrue
- 许可证: MIT
- 开发语言: Go
PostgREST (API)
一个独立的 web 服务器,可将您的 Postgres 数据库直接转换为 RESTful API。
我们结合 pg_graphql
扩展来提供 GraphQL API。
- 官方文档: postgrest.org
- 源代码: github.com/PostgREST/postgrest
- 许可证: MIT
- 开发语言: Haskell
实时功能 (API & 多人协作)
一个可扩展的 WebSocket 引擎,用于管理用户在线状态、广播消息和流式传输数据库变更。
- 官方文档: Supabase 实时功能文档
- 源代码: github.com/supabase/realtime
- 许可证: Apache 2
- 开发语言: Elixir
存储API (大文件存储)
兼容 S3 的对象存储服务,将元数据存储在 Postgres 中。
- 官方文档: Supabase 存储参考文档
- 源代码: github.com/supabase/storage-api
- 许可证: Apache 2.0
- 开发语言: Node.js / TypeScript
Deno (边缘函数)
一个现代化的 JavaScript 和 TypeScript 运行时。
postgres-meta
(数据库管理)
用于管理 Postgres 的 RESTful API。可获取表信息、添加角色和执行查询。
- 官方文档: supabase.github.io/postgres-meta
- 源代码: github.com/supabase/postgres-meta
- 许可证: Apache 2.0
- 开发语言: Node.js / TypeScript
Supavisor
一个云原生的多租户 Postgres 连接池管理器。
- 官方文档: Supavisor GitHub Pages
- 源代码:
supabase/supavisor
- 许可证: Apache 2.0
- 开发语言: Elixir
Kong (API网关)
一个基于NGINX构建的云原生API网关。
- 官方文档: docs.konghq.com
- 源代码: github.com/kong/kong
- 许可证: Apache 2.0
- 开发语言: Lua
产品原则
我们的目标是提供一种任何大型公司都会为自己设计的架构,然后围绕该架构提供对独立开发者和小团队易于使用的工具。
我们遵循一系列原则来确保可扩展性和可用性永远不会相互排斥:
所有功能均可独立运行
每个系统必须作为独立工具运行,且尽可能减少依赖组件。 对此的检验标准是:"用户能否仅使用Postgres数据库就运行这个产品?"
所有功能都是集成的
Supabase具有可组合性。尽管每个产品都能独立运行,但平台上的每个产品都应该使其他产品的价值提升10倍。 为了实现集成,每个工具都应提供API和Webhooks接口。
所有功能都是可扩展的
我们谨慎考虑添加新工具,更倾向于扩展现有工具。 这与许多云服务提供商形成鲜明对比,后者不断将产品扩展到小众用例。我们为开发者提供_基础组件_,使他们能够实现任何目标。 少即是多,但更好。
所有功能都是可移植的
为了避免供应商锁定,我们确保迁移进出都很容易。我们的云服务产品与自托管产品兼容。
我们使用现有标准来提高可移植性(如pg_dump
和CSV文件)。如果出现与"Supabase"方法竞争的新标准,我们将弃用原有方法转而支持标准。
这迫使我们必须在用户体验上竞争。我们的目标是成为最好的Postgres托管服务。
着眼长远发展
我们牺牲短期利益以换取长期收益。例如,虽然可以轻易地运行一个带有额外功能的Postgres分支,但这些功能可能只有我们的客户需要。 相反,我们更倾向于支持将缺失功能贡献到上游项目,让整个社区受益。这种做法还能确保系统的可移植性和长期可持续性。
为开发者而建
"开发者"是一类特殊的用户群体:他们是_构建者_。 在评估投入产出比时,开发者能创造出极高的效率杠杆,因为他们可以构建各种产品和系统。 随着开发者群体的特征随时间演变,Supabase将持续进化产品以适应这种变化。
支持现有工具
Supabase尽可能支持现有工具和社区。Supabase更像是一个"社区的社区"——每个工具通常都有自己的社区,我们与这些社区紧密合作。 我们以协作方式践行开源理念:雇佣维护者、赞助项目、投资企业,并开发我们自己的开源工具。