更新 MQ/RocketMQ.md

This commit is contained in:
8ga 2025-03-20 15:53:18 +08:00
parent e99016b832
commit 0a27b6d3db

View File

@ -94,4 +94,58 @@
## 注意事项 ## 注意事项
事务消息只保证**本地主分支事务**和**下游消息发送事务**的一致性,不能保证消息消费结果和上游事务的一致性。所以下游服务要保证自己的分支事务正确处理,并做好消费重试机制,宕机、重启这种短暂的不可用,可以直接利用服务端的重试机制。在消息提交到下游消费端处理完成之前,下游分支和上游事务之间的状态可能会不一致。因此,**事务消息仅适合接受异步执行的事务场景**。 事务消息只保证**本地主分支事务**和**下游消息发送事务**的一致性,不能保证消息消费结果和上游事务的一致性。所以下游服务要保证自己的分支事务正确处理,并做好消费重试机制,宕机、重启这种短暂的不可用,可以直接利用服务端的重试机制。在消息提交到下游消费端处理完成之前,下游分支和上游事务之间的状态可能会不一致。因此,**事务消息仅适合接受异步执行的事务场景**。
# 消费重试
当发生以下情况,将会触发消费重试机制:
- 网络异常造成连接失败或请求超时
- 生产者调用服务端失败或者超时SDK会重新投递
- 服务端节点处于重启或下线等状态
- 服务端卡顿造成请求超时
- 服务端系统异常、流控
对于事务消息超时和异常不会进行重试,走回查的逻辑。触发重试会立即重试无时间间隔,如果是流控错误,将按照指数退避策略延迟重试,指数退避策略通过以下参数控制间隔:
- INITIAL_BACKOFF第一次失败重试需等待多久默认1秒
- MULTIPLIER退避倍率默认1.6
- JITTER随机抖动因子默认0.2
- MAX_BACKOFF等待间隔上限默认120秒
- MIN_CONNECT_TIMEOUT最短重试间隔默认20秒
SDK内置的重试机制并不能保证消息发送一定成功因为生产者达到重试限制后仍然发送失败需要自己兜底处理。由于远程调用的不确定性如果触发消息重试可能会产生消息重复的问题消费者也要处理好消费重复的问题比如幂等性消费。
# 死信队列
当一条消息达到最大重试次数仍然消费失败服务端将挪到一个特殊的队列这个队列中的消息无法再被消费者正常消费。SDK有开启死信队列的消费API默认3天后自动删除。
# 流控机制
- 当消费组的消费位点处于队列的最大消费位点,而某些业务又在回溯队列的历史消息,这时就会触发流控
- 消费过慢,导致队列中大量的消息堆积,超过一定数量也会触发流控,目的是减少下游消费的压力
为避免触发消息流控,可以利用可观测性功能监控系统容量等,保证资源充足。
# 消费模式
一条消息支持被多个消费组订阅,每个消费组可以初始化若干个消费者。消费者有两种模式的消费:
- 广播Broadcast
- 共享Share
<img width='80%' src='https://silent-detective-d21.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb16fce1b-27a1-4dcb-9acd-94f2230a4da4%2Fconsumemode-74d53c59b3266f1f633b1392f5a0f279.png?table=block&id=f666f7bb-2c6b-45d5-a2f7-91d85e4097ce&spaceId=60569f3a-f166-46d7-9825-a6cdb259b284&width=1420&userId=&cache=v2'>
##### 广播消费
每个消费组只初始化唯一的一个消费者,多个消费组订阅这个 topic 时,每个消费者都能消费到。该方式一般可用于网关推送、配置推送、集群实例之间同步缓存等场景。
##### 共享消费
每个消费组下初始化多个消费者这些消费者共同分担消息1条消息只被其中1个消费者处理。可以实现消费组内流量的水平拆分和负载均衡一般用于微服务解耦。
PushConsumer默认且仅使用消息粒度负载均衡策略同一消费组内的多个消费者将按照消息粒度平均分摊所有消息。
<img width='80%' src='https://silent-detective-d21.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc2dd9f23-3994-49a8-84e4-fdee3c4324f8%2Fclustermode-dfd781d08bc0c69111841bda537aa302.png?table=block&id=a2d115a4-8872-4cd4-83d6-40074918b3b9&spaceId=60569f3a-f166-46d7-9825-a6cdb259b284&width=1420&userId=&cache=v2'>
# 消息存储