10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

Grab 订阅平台从 SQS 和 Redis 切换到 Temporal

  • 2025-07-22
    北京
  • 本文字数:1377 字

    阅读完需:约 5 分钟

大小:673.36K时长:03:49
Grab订阅平台从SQS和Redis切换到Temporal

Grab基于Temporal构建了新的GrabUnlimited架构。该公司增强了用户体验,并将其服务于数百万用户的订阅平台的生产事件减少了 80%。新架构显著提高了系统的鲁棒性和可扩展性,解决了之前解决方案中的一系列问题。

 

GrabUnlimited 是 Grab 的订阅计划,为按月付费的会员提供福利。支持 GrabUnlimited 的平台实现了两个主要流程:一个是注册会员,另一个是更新会员。随着订阅者基数的增长,该公司开始遇到问题和系统中断。根据运维指标,Grab 观察到用户因数据库中会员状态损坏而被阻止、会员资格未能自动续订,或用户在续订后未收到福利等问题。

 

Grab 的工程经理Michel Parreno和首席工程师Theodore Felix Leo描述了在初始架构中遇到的问题:

 

随着最初的成功,从 2022 年 1 月到 2023 年 6 月,订阅者数量大幅增加超过 1000%,支持 GrabUnlimited 的架构开始出现压力迹象。常见的订阅者问题,如未收到会员福利,以及开发者问题,表现为服务中断次数增加,突显了系统的低弹性。罪魁祸首是什么?一个后端服务,虽然功能强大,但并未被没有被构建来有效地管理快速扩展的成员模型的复杂性。

 

GrabUnlimited 的原始架构依赖于Amazon RDS进行数据存储,SQS进行消息传递,Redis进行缓存和分布式加锁。采用状态机模式来跟踪成员状态。随着时间的推移,由于订阅者数量不断增加,用于检索到期续订会员的每日 cron 作业变得越来越慢。开发团队不得不将任务分成多个批次,并最终垂直扩展数据库。此外,由于 5 分钟 Redis 锁的限制,续订过程可能导致会员状态损坏。

 

GrabUnlimited 的原始架构(来源:Grab的工程博客

 

该解决方案还存在弹性问题,即上游服务的中断,加上 SQS 重试没有指数回退,可能会导致服务在恢复上线时超载。最后,随着状态转换数量的增加,原始架构中的订阅服务变得过于复杂。它还缺乏幂等性保证,导致在重试过程中福利被重复授予。

 

在考虑了原有架构的问题及其对用户体验和运维开销的影响之后,团队开始寻找解决方案。工程师们没有选择重构现有的系统,而是选择基于Temporal,(Grab 的另一个团队之前采用的开源工作流编排引擎),用一个新的架构取代现有的架构。

 

团队仔细评估了 Temporal 的多个方面,包括可扩展性、可靠性、性能、安全性,以及开发工作量、成本和可测试性。新架构得益于 Temporal 的许多内置特性,如无限重试、指数回退、速率限制和可观测性。


使用 Temporal 构建 GrabUnlimited 的新架构(来源:Grab的工程博客

 

在新架构中,每天的 cron 作业被Timer替换,它允许根据用户的订阅时间将续订过程在一天中分散进行,从而大大提高了可扩展性。通过利用 Temporal 的内置工作流执行能力,解决了之前的并发挑战,相同的工作流ID被分配给运行互斥操作的多个工作流实例。

 

团队还利用了 Temporal 的弹性机制(如无限重试和指数回退)来配置适当的重试策略,以防止外部服务在短暂的可用性问题出现时被压垮。通过设计工作流步骤来处理不同的责任,并利用 Temporal 进行错误处理和工作流执行的排序,解决了之前架构中的幂等性问题。

 

在采用 Temporal 的过程中,GrabUnlimited 团队学到了很多,并不得不调整他们对系统设计的方法,以充分利用 Temporal 的功能。工程师们强调,这种转变使他们能够专注于产品平台的重要方面,而不是花费时间实现基本构建块。尽管采用新技术存在挑战,但团队相信“学习曲线是有回报的”。

 

原文链接:

https://www.infoq.com/news/2025/07/grab-temporal-sqs-redis/

2025-07-22 12:006895

评论

发布
暂无评论

链政经济:区块链如何服务新时代治国理政

CECBC

我,35岁程序员,离职前是这么做的

梦想橡皮擦

9月日更

手撸二叉树之从前序与中序遍历序列构造二叉树

HelloWorld杰少

9月日更

linux之sshpass命令

入门小站

Linux

设计消息队列存储消息数据的MySQL 表格

feitian

完成年初的一个小目标:七个月体重复盘

石云升

减肥 9月日更

敏捷开发模式下测试经理没有了话语权?

BY林子

敏捷测试 敏捷转型

架构实战营作业 -- 模块三

冬瓜茶

千万级学生管理系统的考试试卷存储方案

穿裤子的云

JavaScript进阶(四)防抖

Augus

JavaScript 9月日更

假期的的生活?

卢卡多多

假期 9月日更

NFT 这么火,你知道 ERC721 么

Rayjun

以太坊 ERC ERC721

架构实战营模块八作业-消息队列存储数据的MYSQL设计

王晓宇

架构实战营

序列化与反序列化系列二:JPA与Querydsl

程序员架构进阶

架构 9月日更 QueryDSL Spring JPA

🏆【算法数据结构专题】「限流算法专项」带你认识常用的限流算法的技术指南(分析篇)

码界西柚

ratelimiter 限流算法 9月日更 限流器

网络攻防学习笔记 Day141

穿过生命散发芬芳

网络安全 9月日更

什么是网络安全等级保护

网络安全学海

网络安全 信息安全 WEB安全 等级保护 黑客、

纯CSS实现『斑马纹理投影文字』

德育处主任

CSS css3 大前端 纯CSS

全场景进化与无缝协同:荣耀的高端化势能进程

脑极体

架构实战营 - 模块八作业

Julian Chu

如何使用协程与生命周期感知型组件结合使用

Changing Lin

9月日更

在线JSON转Go Bson工具

入门小站

工具

Vue进阶(幺贰幺):ElementUI 表单校验注意事项

No Silver Bullet

Vue elementUI 表单校验 9月日更

模块八作业

Mr.He

架构实战营

架构1期模块八作业

五只羊

架构实战营

测试常用英语(持续更新中)

IT蜗壳-Tango

9月日更

数据安全

奔向架构师

数据仓库 数据安全 9月日更

Prometheus 2.23.0 新特性

耳东@Erdong

Prometheus 9月日更

架构实战营 - 模块八作业

思梦乐

CentOS7 Linux实用命令

Mike

数字经济成为经济高质量发展的重要推动力

CECBC

Grab订阅平台从SQS和Redis切换到Temporal_架构_Rafal Gancarz_InfoQ精选文章