英国《卫报》技术团队优化移动推送通知速度以提升读者体验
英国《卫报》的技术团队致力于加快移动推送通知的交付速度,以改善读者的阅读体验。原本为并发性优化的架构在通知交付方面存在延迟问题,工程师通过改进可观测性并进行实验,取得了显著进展。
背景与问题
《卫报》的移动应用用户可以通过推送通知接收突发新闻提醒。自2009年以来,该系统基于事件驱动架构(EDA)运行,但随着时间的推移,通知交付时间逐渐增加,部分用户的接收时间甚至超过5分钟。
目标
全栈开发者Francesca Hammond表示,团队的目标是确保90%的目标受众在2分钟内收到通知,这一目标被称为“90in2”。
技术架构
推送通知的交付系统采用了多种技术:
- 内部突发新闻工具与Scala Play应用通信以触发推送通知。
- AWS Lambda函数从AWS SQS队列中获取消息,负责从自托管的PostgreSQL数据库中获取通知注册信息,并将其发送到Google和Apple的推送通知平台。
改进措施
- 提升可观测性
团队使用ELK堆栈来提高整个流程的可观测性,从而识别瓶颈。 - 数据库连接优化
团队发现获取通知注册信息是主要瓶颈,且存在大量数据库连接错误导致处理时间过长。为此,团队引入了RDS代理,使Lambda函数不再直接连接数据库,从而避免了数据库连接限制问题。 - 查询性能优化
长时间查询是另一个延迟源。团队确认了查询计划的正确性,并通过完全清理过程移除“死行”(数据库仍保留的逻辑删除行),同时将数据库从版本10升级到13,以利用更强大的AWS Gravitron2处理器。 - 数据库升级
为了最小化切换过程中的停机时间,团队创建了新的RDS实例,并设置了逻辑复制以持续同步数据。在切换时,团队更新了服务以使用新实例,并立即禁用了逻辑复制。 - Lambda函数优化
团队发现向Apple/Google平台提交通知的Lambda函数在发送超过80万接收者的突发新闻时,耗时最高达6分钟。通过实验,团队增加了Lambda函数中Scala应用的线程池大小以提高并行性,并将Lambda函数的内存和CPU设置为支持的最大值,从而降低了函数执行时间。
未来计划
Hammond表示,团队正在评估是否需要更大的架构变更,特别是针对发送给200万以上订阅者的通知。为此,团队计划采用RFC风格的流程来收集想法和反馈,然后再进行开发。
开源平台
《卫报》的核心通知平台是开源的,代码可在GitHub上获取。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。