《卫报》优化移动推送通知传递架构

英国《卫报》技术团队优化移动推送通知速度以提升读者体验

英国《卫报》的技术团队致力于加快移动推送通知的交付速度,以改善读者的阅读体验。原本为并发性优化的架构在通知交付方面存在延迟问题,工程师通过改进可观测性并进行实验,取得了显著进展。

背景与问题

《卫报》的移动应用用户可以通过推送通知接收突发新闻提醒。自2009年以来,该系统基于事件驱动架构(EDA)运行,但随着时间的推移,通知交付时间逐渐增加,部分用户的接收时间甚至超过5分钟。

目标

全栈开发者Francesca Hammond表示,团队的目标是确保90%的目标受众在2分钟内收到通知,这一目标被称为“90in2”。

技术架构

推送通知的交付系统采用了多种技术:

  • 内部突发新闻工具与Scala Play应用通信以触发推送通知。
  • AWS Lambda函数从AWS SQS队列中获取消息,负责从自托管的PostgreSQL数据库中获取通知注册信息,并将其发送到Google和Apple的推送通知平台。

改进措施

  1. 提升可观测性
    团队使用ELK堆栈来提高整个流程的可观测性,从而识别瓶颈。
  2. 数据库连接优化
    团队发现获取通知注册信息是主要瓶颈,且存在大量数据库连接错误导致处理时间过长。为此,团队引入了RDS代理,使Lambda函数不再直接连接数据库,从而避免了数据库连接限制问题。
  3. 查询性能优化
    长时间查询是另一个延迟源。团队确认了查询计划的正确性,并通过完全清理过程移除“死行”(数据库仍保留的逻辑删除行),同时将数据库从版本10升级到13,以利用更强大的AWS Gravitron2处理器。
  4. 数据库升级
    为了最小化切换过程中的停机时间,团队创建了新的RDS实例,并设置了逻辑复制以持续同步数据。在切换时,团队更新了服务以使用新实例,并立即禁用了逻辑复制。
  5. Lambda函数优化
    团队发现向Apple/Google平台提交通知的Lambda函数在发送超过80万接收者的突发新闻时,耗时最高达6分钟。通过实验,团队增加了Lambda函数中Scala应用的线程池大小以提高并行性,并将Lambda函数的内存和CPU设置为支持的最大值,从而降低了函数执行时间。

未来计划

Hammond表示,团队正在评估是否需要更大的架构变更,特别是针对发送给200万以上订阅者的通知。为此,团队计划采用RFC风格的流程来收集想法和反馈,然后再进行开发。

开源平台

《卫报》的核心通知平台是开源的,代码可在GitHub上获取。

阅读 29
0 条评论