在RocketMQ中,组合模式用于将一个大的消息分割为多个Part,然后再组合起来。
具体来说:
大消息问题
当消息很大时,直接发送可能会有问题:
- 单条消息太大超出限制
- 传输效率较低
- 失败概率高
组合模式
RocketMQ采用组合模式将大消息分片成多个Part:
- 每个Part相当于一个小消息
- 包含Part序号和消息ID
- 分别发送这些Part消息
- 指定相同的消息ID
- 消费者接收Part后,按消息ID组合
具体实现
发送消息时:
Message msg = new Message("TopicA", tag, payload);
// 消息 greater than 1024*1024
MessageSplitter splitter = new MessageSplitter();
List<Message> messages = splitter.splitMessage(msg, 1024*100);
for (Message message: messages){
producer.send(message);
}
consumer端:
if (msg.getBody().startsWith("##")) {
// 组装所有Part为一个完整消息
MessageAssembler.assemble(msg, queue);
}
所有Part通过消息ID 进行组合。
优点
RocketMQ通过组合模式,将大消息分片传输:
- 降低单条消息大小
- 提高传输效率
- 减少失败概率
- 客户端通过消息ID自动组合
符合组合模式的设计初衷:
- 将对象分解为较小部件进行操作
- 再组合在一起
总的来说,RocketMQ利用组合模式拆分大消息,提高传输效率。