Skip to main content

RocketMQ消息队列规约

作者:程序员马丁

在线博客:https://nageoffer.com

note

热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。

命名规范

RocketMQ 相关命名强制使用英文小写。

1)【强制】Topic 命名:业务线项目名topic。业务线或项目包含多个单词,使用 - 分割,例如:common_message-center_topic

2)【强制】Tag 命名:业务线项目业务_tag,例如:common_message-center_send-message_tag

3)【强制】生产者组命名:业务线项目**业务_pg,例如:common_message-center_send-message_pg

4)【强制】消费者组命名:业务线项目**业务_cg,例如:common_message-center_send-message_cg

申请规范

创建 Topic 需要走线上申请,申请时补充下述信息。


申请人:马丁

Topic:common_message-center_topic

Produce:

生产应用生产者组Tag备注
1message-centercommon_message-center_send-message_pgcommon_message-center_send-message_tag流量削峰
2message-centercommon_message-center_send-message_pginsurance_trading-order_send-message-fail_tag微信模板消息发送失败通知保险项目

Consume:

消费应用消费者组Tag消费模型备注
1message-centercommon_message-center_send-message_cgcommon_message-center_send-message_tag集群模式发送微信模板、短信、小程序等消息
2trading-orderinsurance_trading-order_send-message-fail_cginsurance_trading-order_send-message-fail_tag集群模式微信模板消息发送失败通知保险项目

使用规范

1. 消息发送

1)【强制】消息生产者创建时,必须指定生产者组。

2)【强制】一个系统对应一个 Topic,系统下的不同业务根据 Tag 区分,参考申请规范-消费应用 Tag。

3)【强制】发送消息时,需设置 KEYS。KEYS 建议定义为业务唯一标识,比如订单 ID。

4)【强制】发送消息不管发送成功或失败,需打印 KEYS、Payload、执行时间以及 SendResult

5)【强制】发送消息时,需设置超时时间,避免应用被拖垮;建议超时时间设置为 2000ms 内。

6)【建议】针对可靠性较高的消息,发送失败后可以存储到 DB,开启定时任务扫描,并重新投递。

2. 消息消费

1)【强制】消费端创建时,必须指定消费者组。

2)【强制】消费端需要保证数据幂等。

3)【强制】消费消息不管成功或失败,需打印 KEYS、MsgId、执行时间以及 Message。

4)【强制】不同的应用集群应使用不同的消费者组,如果不同的应用集群需要订阅同一消费者组,需保证 Topic Tag 订阅关系一致。

5)【强制】打印消息消费日志。

log.info("Execute result: {}, Keys: {}, Dispatch time: {} ms, Execute time: {} ms, Message: {}", ...);

6)【建议】消费时尽量不设置重试,大部分情况下,执行失败的消息重试后会再次失败,反而会影响消费进度。开发者应该针对特定场景在代码中设置重试逻辑。

7)【建议】消费者并发消费数量默认为 1,即串行化,应该基于不同系统场景来设置并发数,同时要考虑消费过程中其它组件的压力。

  • 系统 CPU 任务少:CPU 核数 / (1 - 阻塞系数 0.8)
  • 系统 CPU 任务较多,建议 CPU 核数 + 1 即可。