1. 批量消息
为什么使用批量消息
- 在很多调优的时候,比如数据库批量处理,有些请求进行合并发送等都是类似批量的实现。
- RocketMQ 批量发送也是为了追求性能,特别在消息数据量特别大的时候,批量效果就非常明显。
使用批量消息的限制
- 同一批次的消息应该具有相同主题、相同的消息配置。
- 不支持延迟消息。
- 建议一个批量消息大小最好不要超过 1MB。
使用批量消息
http://rocketmq.apache.org/docs/batch-example/
2. 事务消息
什么是事务消息
- RocketMQ 的事务消息,是指 Producer 端消息发送事件和本地事务事件,同时成功或同时失败。
RocketMQ 事务消息设计
![image.png](/uploads/projects/ziqiong@java1/9207ef3a26567f929824a6401d101918.png)
- 当第四步未能及时提交时,MQ Server 会进行主动查询(第五步)。
事务消息的约束
- 事务消息不支持定时和批量。
- 为了避免一个消息被多次检查,导致半数队列消息堆积。RocketMQ 限制了单个消息的默认检查次数为 15 次。通过修改 broker 配置文件中的 transactionCheckMax 参数进行调整。
- 特定的时间段之后才检查事务。通过 broker 配置文件参数 transactionTimeout 或用户配置 CHECK_IMMUNITY_TIME_IN_SECONDS 调整时间。
- 一个事务消息可能被多次检查或消费多次。
- 提交过的消息重新放到用户目标主题可能会失败。
- 事务消息的生产者 ID 不能与其他类型消息的生产者 ID 共享。
事务消息的状态
- TransactionStatus.CommitTransaction:提交事务,允许消费者消费这个消息。
- TransactionStatus.RollbackTransaction:回滚事务,消息将会被删除或不再允许消费。
- TransactionStatus.Unknown:中间状态,MQ 需要重新检查来确认状态。