【设计模式】RocketMQ中组合模式:消息由多个Part组合而成

在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利用组合模式拆分大消息,提高传输效率。