Canva近期重新设计会话撤销基础设施,以支撑数亿活跃会话,并让大多数身份验证请求无需联网查询数据库。新架构将撤销数据以紧凑、不可变形式写入Amazon S3,再以内存索引分发到应用网关。Canva表示,这一调整提升了部署速度,减少了数据库基础设施开销,并使撤销缓存的内存占用降低87.5%。
此前,Canva将会话信息保存在加密的浏览器Cookie中,网关无需访问网络数据存储即可验证请求,但已撤销会话和权限变更需要近实时生效。旧方案仅在内存中保留12小时撤销数据,会话刷新操作却仍需持续查询MySQL。随着规模扩大,部署期间数百个网关实例会各自向MySQL请求超过100万条撤销记录,形成集中式数据库负载。
Canva选择S3而非Redis,主要是为了不额外维护另一套数据存储,同时获得持久化能力。12小时撤销窗口被切分为30分钟的S3对象,网关按需下载。每条撤销记录采用16字节二进制结构,包含主体和时间戳,排序后可直接在内存中搜索,因此缓存占用减少87.5%。网关通过条件GET请求下载变更对象,并丢弃超过12小时的数据。异步Worker会扫描新撤销记录,合并至最新对象后上传;同一对象更新时,条件PUT提供乐观并发控制。ZooKeeper领导者选举可降低冲突概率,但并非确保正确性的必要条件。
恢复与部署方面,网关可通过下载相关S3对象重建本地撤销状态,无需依赖数据库重建缓存。Canva称,单个Worker每秒可处理超过2000次撤销操作,超出预期需求;即使一个对象包含100万次撤销记录,二进制数据大小也仅约16MB。
该设计在Reddit引发讨论。有评论认为,使用短有效期访问令牌并将刷新令牌存在数据库中即可,不必逐一比对百万级撤销缓存。Canva工程师Llew Vallis回应称,将撤销数据保存在内存中是更优权衡,因为频繁令牌刷新会增加数据库负载,并让刷新操作期间的可用性受制于数据库。迁移完成后,Canva将撤销数据库缩减为两个读取冗余副本,部署速度提升,数据库负载按照撤销写入吞吐量和网站整体流量扩展,而非加载缓存的网关实例数量。Canva表示,他们已在真实基础设施上测试多种实现,验证了该方案在单个数组包含数十万次撤销等工作负载下仍能满足可扩展性要求。
热门跟贴