技术深度解析
SpiceDB不仅仅是一个访问控制库;它是一个为授权检查这一特定工作负载而设计的分布式数据库。其核心是对Google Zanzibar论文的实现,该论文描述了一个每天处理数十亿次授权检查、延迟低于10毫秒的系统。SpiceDB通过几个关键组件复现了这一架构:
关系图谱: 与传统的RBAC(权限是静态的,例如角色:管理员)不同,SpiceDB将所有内容建模为关系。用户`u`是组`g`的`成员`。文档`d`由用户`u``拥有`。组`g`对文档`d`拥有`查看者`权限。然后通过遍历这个图来计算权限。例如,要检查用户`u`是否可以查看文档`d`,SpiceDB会遍历图:`u` -> `成员` -> `g` -> `查看者` -> `d`。这就是ReBAC的精髓。
Schema定义语言(SDL): SpiceDB引入了一种声明式模式语言来定义资源类型、关系和权限。一个典型的模式如下:
```
definition user {}
definition organization {
relation member: user
permission view = member
}
definition document {
relation owner: user
relation parent: organization
permission view = owner + parent->view
}
```
这个模式定义了文档的`view`权限授予其`owner`或任何对父组织拥有`view`权限的用户。这种可组合性对于层次结构非常强大。
存储与一致性: SpiceDB在权限检查逻辑方面是无状态的;状态存储在外部数据库中。最常见的生产设置使用CockroachDB,因为它具有强一致性和水平可扩展性。SpiceDB在CockroachDB之上实现了一个自定义数据模型,使用一个`relationship`表来存储(资源、关系、主体)元组。为了实现Zanzibar级别的性能,SpiceDB使用了一种称为“不相交集”缓存的技术和一个专门的查询引擎,可以高效地执行图遍历。团队发布的基准测试显示,单个SpiceDB实例每秒可处理超过10,000次权限检查,p99延迟低于10毫秒。
检查API与缓存: 最关键的API端点是`CheckPermission`。给定一个资源、一个权限和一个主体,它返回`true`或`false`。在内部,SpiceDB使用多层缓存策略。第一层是用于最近检查的内存LRU缓存。第二层是分布式缓存(例如Redis),用于更持久地缓存关系子图。第三层则访问数据库。这种分层方法对于在高并发下保持低延迟至关重要。
基准性能数据:
| 配置 | 检查次数/秒 | p50延迟 | p99延迟 | 数据库后端 |
|---|---|---|---|---|
| 单节点SpiceDB(无缓存) | 2,500 | 4.1ms | 18.2ms | CockroachDB(3节点) |
| 单节点SpiceDB(缓存预热) | 12,000 | 0.8ms | 3.5ms | CockroachDB(3节点) |
| 3节点SpiceDB集群(缓存预热) | 35,000 | 1.2ms | 5.1ms | CockroachDB(5节点) |
| 单节点SpiceDB(PostgreSQL) | 1,800 | 5.5ms | 22.0ms | PostgreSQL(1节点) |
*数据要点:SpiceDB的性能严重依赖于缓存和数据库后端。对于生产工作负载,使用CockroachDB后端并预热缓存对于实现Zanzibar承诺的亚10毫秒p99延迟至关重要。该系统随着SpiceDB节点的增加几乎线性扩展,使其适用于非常高吞吐量的环境。*
开源实现: SpiceDB核心仓库(github.com/authzed/spicedb)使用Go编写,已获得超过6700个星标。社区还构建了几个重要的配套工具:`zed`(用于与SpiceDB交互的CLI)、`spicedb-operator`(用于Kubernetes部署)以及Go、Python、Java和TypeScript等多种客户端库。该项目采用Apache 2.0许可证,确保其保持开放和可审计。
关键参与者与案例研究
AuthZed,由前Google工程师(包括曾参与内部授权系统工作的Joseph Schorr和Jake Moshenko)创立的公司,是SpiceDB的主要维护者。他们提供托管云服务(AuthZed Dedicated)和企业支持。然而,开源社区已成为采用的重要推动力。
知名采用者与用例:
- Netflix: 使用SpiceDB管理其内部工作室工具的权限,处理跨多个制作团队的节目、季、剧集和用户角色的复杂层级。他们为项目贡献了多项性能优化。
- Canva: 这个图形设计平台使用SpiceDB在其庞大的模板、素材和团队文件夹库中强制执行权限。Canva的规模——数亿用户——推动SpiceDB优化了其针对多租户工作负载的缓存层。
- Indeed: 这个求职平台使用SpiceDB管理其招聘生态系统中的复杂权限,包括雇主账户、职位发布和候选人数据。Indeed的采用帮助验证了SpiceDB处理高基数关系的能力。