海量消息下王者荣耀在 TDMQ Pulsar 的实践

关于王者荣耀

《王者荣耀》是由腾讯游戏开发的一款运营在Android、IOS平台上的MOBA类手游,属于多人联机在线竞技类游戏,于2015年11月26日在Android、IOS平台上正式公测。上线以来受到广大手游玩家的热爱,目前该游戏在手游排行中处于TOP 1的位置。作为中国最火爆的手机游戏,"王者荣耀",拥有亿级用户体量,千万级日活用户。

而如此庞大用户体量带来的,也是服务端的挑战。如在游戏中产生的海量消息和数据交互,好友上线通知、开始游戏、赠送金币以及核心之一的交易链路,服务端如何敏捷快速实现上述海量消息场景,并解耦业务组件,是系统架构设计的一个难题。

消息队列选型

在游戏的实际运行中,大量的业务场景下存在消息数据交互,业务量有明显的波峰波谷,需要有一款消息队列中间件来承载该业务流程,实现上下游业务组件的松耦合,同时还需要具备灵活的扩展性。TDMQ Pulsar 版进入了王者荣耀团队的技术选型视野。

TDMQ Pulsar 版由于其存算分离的架构,对于计算密集型的业务场景,仅需要添加计算层 Broker ,自动进行 Rebalance;对于海量消息堆积,存储不足时,添加新的 BK 节点即可。在容灾支撑方面,TDMQ Pulsar 版专业集群支持 3AZ 跨可用区部署,以确保发生可用区故障时,也能正常提供服务;同时还提供了跨地域冷备功能,支持快速切换接入点解析,实现无需客户端修改接入点地址,而实现跨地域的容灾方案,保障业务的延续性。在场景支撑方面,TDMQ Pulsar 版承载了腾讯计费、中国银行、FiT 等金融场景下的核心交易链路,同时也服务了火影忍者、蛙扑等游戏客户。从各方面来说,都非常匹配王者荣耀的需求。

TDMQ Pulsar 版产品介绍

腾讯云 TDMQ for Apache Pulsar 版(简称TDMQ Pulsar版)是基于 Apache Pulsar 自研的消息中间件,具备极好的云原生和 Serverless 特性,计算存储分离的架构使其在扩缩容方面具备良好的底层优势。

在完全兼容社区版的基础上,TDMQ Pulsar 版还提供了重试&死信队列、消息标签过滤、消息轨迹等高级特性。

目前 TDMQ Pulsar 版已经有较大规模的应用,如王者荣耀、猫眼、微民保险、QQ音乐、领星、长安汽车等,以及包括腾讯计费绝大部分场景,包括支付主路径、实时对账、实时监控、大数据实时分析等方面。

TDMQ Pulsar 在王者荣耀中的应用方式

弹性能力

得益于存算分离的架构,使得 TDMQ Pulsar 版高度契合云原生,具有极强的可扩展性,为王者荣耀业务量的变化提供快速扩容能力,同时具备的热升级能力,使得扩容时对业务完全透明。

发布订阅

王者荣耀的消息场景下,存在大量的收发比超过「1比2」的情况,即:一处生产多处消费。同时,下游的消费端需要根据「消息标识」来消费指定的消息。

TDMQ Pulsar 版支持多种订阅模式,同时支持 TAG 消息标签过滤,方便王者荣耀的业务端简化业务逻辑处理流程。具体实现如图所示,应用于如用户界面操作,开始游戏、赠送金币等功能。

实时交易

王者荣耀的实时交易场景中,存在抽奖、购买等用户行为。那么,业务侧需要在用户发起操作后,对用户账户进行扣费操作,并在扣费完成后开始发货。详细的业务流程图,如下所示:

由于涉及到货币交易,在该业务流程中,需要保证以下几点:

  1. 扣费消息绝对不能丢失;

  2. 业务环节较长,需要支持重试操作;

  3. 需要支持延时消息,来延迟查询发货状态,减少服务端资源开销。

TDMQ Pulsar 版可以完美解决上述的需求。

● 首先,消息存储默认为 3 副本,并通过 Quorum 机制,高效保证多副本之间的一致性;

● 其次,通过重试队列和死信队列,支持业务客户端自定义消息投递的重试和死信队列,如重试多次后仍不能成功,则进入死信队列人工处理;

● 最后,支持定时/延时消息,服务端来延时推送消息到下游消费者,无需客户端额外逻辑处理,简化业务实现。

用户评价

TDMQ Plusar 版支持按 Tag 订阅消息,在不同消费者消费同一 Topic 时通过指定不同的 Tag减少了业务侧过滤消息的压力,提升了业务模块单机吞吐量减少了机器成本。TDMQ 支持按照命名空间维度配置消息生产、消费速率,方便业务进行全局的流量控制,避免引入分布式限流组件,减少了业务的复杂度。

随着业务使用量的增加,单集群生产/消费速率已突破40w/s,得益于 TDMQ 存算分离的架构,在扩容期间能够做到业务侧无感,同时生产消费耗时没有明显增长。配合便捷的监控告警配置,使得业务能够近乎实时的感知集群的生产消费状态异常,及时作出反应。

相关推荐
太阳伞下的阿呆7 天前
kafka-clients之max.block.ms
分布式·kafka·消息队列
假装我不帅11 天前
C# 操作Rabbitmq
消息队列·c#·rabbitmq
Java 第一深情17 天前
RabbitMQ最全教程-Part1(基础使用)
分布式·消息队列·rabbitmq
ktkiko1119 天前
Java中消息队列——ActiveMQ、RabbitMQ、RocketMQ、Kafka
java·消息队列
确实可以25 天前
7.使用Redis进行秒杀优化
redis·消息队列·go
极客先躯1 个月前
高级java每日一道面试题-2024年10月19日-消息队列[RabbitMQ]-RabbitMQ中积压了大量的消息,如何处理?
java·消息队列·rabbitmq·java-rabbitmq·积压大量消息·队列积压·java高级
G丶AEOM1 个月前
定时任务使用kafka
java·消息队列·八股
腾讯云中间件1 个月前
腾讯云上基于 Apache Pulsar 的大规模生产实践
消息队列·腾讯
ApacheRocketMQ1 个月前
Java消息队列入门详解
java·消息队列·开源·rocketmq