快手一面:RocketMQ顺序消息如何增加吞吐量?

文章内容收录到个人网站,方便阅读:hardyfish.top/

资料分享

RocketMQ技术内幕:

RocketMQ顺序消息(Ordered Message)保证消息严格按照顺序消费,但顺序消费天然会限制消息吞吐量。

如果需要提高吞吐量,可以从以下几个维度进行优化:

一、增加队列数(合理划分队列粒度)

顺序消息在RocketMQ中是基于单个Queue顺序消费的,队列越多,并发消费能力就越强。

  • 实践:

    • 将消息按照顺序要求的业务主键进行分片(如订单号、用户ID),同一个分片的消息投递到同一个队列中,不同分片的消息可以并行消费,从而提高整体吞吐量。

例如:

java 复制代码
// 根据订单号取模,确定投递的队列
int queueNum = orderId % queueCount;

常见实践技巧:

① 提高队列数量(最常见)

  • 调整Topic的队列数量,例如从4个队列调整到8或16个。
  • 根据消息的业务标识分配到不同的Queue。
  • 单队列保证单分片顺序,多队列并行提高吞吐。
java 复制代码
// 消息发送示例(自定义消息队列选择器)
SendResult sendResult = producer.send(msg, (mqs, msg, arg) -> {
    int index = (arg.hashCode()) % mqs.size();
    return mqs.get(index);
}, orderId);

② 降低单条消息的业务处理时长

顺序消息的消费速度受限于单个消息的消费速度,因此:

  • 减少顺序消息处理过程中的耗时操作,快速提交消费结果。
  • 异步处理耗时逻辑,顺序消费只负责确认顺序并快速落盘或提交。

例如:

java 复制代码
// 快速消费,异步提交耗时任务
consumer.registerMessageListener((msgs, context) -> {
    // 同步轻量级逻辑,快速返回
    quicklySaveToDB(msgs);
    // 异步线程池处理复杂任务
    asyncExecutor.execute(() -> handleComplexTask(msgs));
    return ConsumeOrderlyStatus.SUCCESS;
});

③ 增加消费者线程数

虽然单个队列是严格串行消费,但多个Queue之间可并发消费,增加消费端线程数或消费者实例数量,提升整体吞吐。

  • 增加消费者实例数量,提升并发处理能力。
  • 合理规划Queue数量,队列数一般建议 >= 消费者实例数。

例如:

diff 复制代码
RocketMQ:
- Topic: 订单顺序消费
- Queue数量: 16 (建议适当增加Queue数)
- 消费者实例数: >= Queue数

推荐的最佳实践组合方案:

  • 发送端: 按照业务逻辑(如订单号)分片,多Queue投递。

  • 消费端:

    • 适度增加消费者线程数量。
    • 增加消费者节点(水平扩容),提高并发能力。
    • 快速消费,耗时操作异步化。

注意事项:

  • 队列越多并行越高,但维护成本也会上升,需要结合具体业务场景平衡。
  • 顺序消息消费端严禁长时间阻塞或耗时较长的操作,否则即使增加队列也无法提高吞吐量。

其实最好用redis list实现队列,因为redis list可以无限扩展,mq加队列很麻烦。

相关推荐
大圣编蚕2 小时前
Spring AOP 失效排查:从原理到实战的完整指南
java·后端·spring
AINative软件工程2 小时前
LLM 多租户 Prompt Isolation 工程实践:为 100 个租户定制 Prompt,但别让它们互相污染
后端·llm
EatFan2 小时前
MCP 从概念到落地:Java(Spring AI Alibaba)与 .NET 双栈接入实操对比
java·人工智能·后端·spring·.net·java后端·mcp
专业程序开发源2 小时前
springboot全民健身和饮食健康管理系统29158-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
ym hyd 1112 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 从服务拆分到注册中心的落地路线
java·开发语言·spring cloud
梦帮科技3 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
Wang's Blog3 小时前
Java框架 SpringCloud 快速入门: 全局过滤器(GlobalFilter)自定义鉴权
java·开发语言·spring cloud
IT_陈寒3 小时前
SpringBoot自动配置的坑:你以为的捷径可能是弯路
前端·人工智能·后端
paopaokaka_luck3 小时前
高校社团管理(AI辅助任务分配、协同过滤算法推荐、ECharts数据可视化、活动参与闭环、校园交流与反馈、器材借还管理)
java·前端·javascript·spring boot·数据分析·echarts