Canva 分享了基于 S3 的架构,用于管理数亿个会话的会话撤销
Canva 对其会话撤销基础设施进行了重新设计,旨在支持数亿个活跃会话,同时在处理大多数身份验证请求时避免进行联网数据库查询。新架构将撤销数据以紧凑、不可变的形式存储在 Amazon S3 中,并将其作为内存索引分发到应用程序网关。Canva 表示,这种方法提高了部署速度,减少了数据库基础设施的开销,并将撤销缓存的内存占用降低了 87.5%。
Canva 将会话信息存储在加密的浏览器 Cookie 中,使网关无需连接网络数据存储即可对请求进行身份验证。不过,已撤销会话和权限变更需要近乎实时地反映出来。此前,Canva 将 12 小时的撤销数据保存在内存中,而会话刷新操作仍然需要持续查询 MySQL。随着平台规模的扩大,在部署过程中,可能有数百个网关实例各自向 MySQL 请求超过 100 万条撤销记录,从而引发了集中的数据库负载压力。
Canva 选择了 Amazon S3 而非 Redis,旨在避免再额外维护另一个数据存储系统,同时为撤销数据提供持久化存储。12 小时的撤销窗口被划分到 30 分钟的 S3 对象,网关会根据需要下载这些对象。每次撤销都以一个 16 字节的二进制记录表示,其中包含主体和时间戳。排序数组支持直接内存搜索,从而将缓存占用空间减少了 87.5%。网关使用有条件的 GET 请求下载已更改的块,并丢弃超过 12 小时的数据。异步工作进程会扫描新的撤销记录,将其合并到最新的块中,并上传结果。当工作进程更新同一对象时,有条件的 PUT 请求提供了乐观并发控制;而 ZooKeeper 领导者选举机制虽然能减少冲突,但并非确保正确性的必要条件。
软件工程师亚 Adam Urban 在 LinkedIn 上分享该文章时强调, Amazon S3 不仅是一个对象存储,更是将不可变对象和条件写入作为协调原语来使用。

Worker 任务如何将撤销操作从数据库复制到 S3(图片