📤 生产者(Producer)设计模式解析
1. 工厂模式(Factory Pattern)
作用:
创建不同类型的生产者实例,隐藏对象创建的复杂性。
应用场景:
- 通过
DefaultMQProducer
和TransactionMQProducer
工厂方法创建具体的生产者实例。
示例:
DefaultMQProducer producer = new DefaultMQProducer("producerGroup");
2. 代理模式(Proxy Pattern)
作用:
为发送消息提供代理,控制对实际发送逻辑的访问。
应用场景:
DefaultMQProducerImpl
作为DefaultMQProducer
的代理,负责具体的消息发送逻辑。- 提供接口简化用户操作,而底层通过代理与 Broker 通信。
示例:
用户调用 send()
方法实际上是通过代理调用 sendKernelImpl()
方法。
3. 策略模式(Strategy Pattern)
作用:
动态选择消息发送策略(如消息队列选择)。
应用场景:
MessageQueueSelector
接口 提供多种队列选择策略(如 Hash、随机等)。- 用户可以自定义实现队列选择逻辑。
示例:
SendResult result = producer.send(msg, new SelectMessageQueueByHash(), orderId);
4. 模板模式(Template Pattern)
作用:
定义消息发送的整体流程,允许子类在不改变结构的情况下重写特定步骤。
应用场景:
send()
方法 包含消息校验、路由选择、消息发送等步骤,每个步骤可以被定制或扩展。
5. 单例模式(Singleton Pattern)
作用:
确保 Producer 的客户端实例全局唯一。
应用场景:
MQClientInstance
使用单例模式管理与 Broker 的连接,避免重复创建实例浪费资源。
📥 消费者(Consumer)设计模式解析
1. 观察者模式(Observer Pattern)
作用:
消费者订阅主题,当有新消息时触发回调处理。
应用场景:
- 消息监听器(
MessageListener
):消费者注册监听器,处理新到达的消息。 - 消费组与 Broker 通信时,Broker 负责通知各个消费者。
示例:
consumer.registerMessageListener(new MessageListenerConcurrently() { public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { // 消费逻辑 } });
2. 责任链模式(Chain of Responsibility Pattern)
作用:
将消息消费的多个步骤串联起来,按顺序处理。
应用场景:
- 消费端消息过滤、拦截器链等逻辑通过责任链模式依次执行。
ConsumeMessageConcurrentlyService
处理并发消息消费的流程链。
3. 状态模式(State Pattern)
作用:
根据不同的状态切换不同的消费行为。
应用场景:
- 顺序消费与并发消费 使用不同的状态管理策略。
ConsumeOrderlyContext
维护消费状态,如 暂停、继续、回滚 等。
4. 策略模式(Strategy Pattern)
作用:
根据不同的消费模式(顺序或并发)选择不同的处理策略。
应用场景:
ConsumeMessageService
接口定义了消费服务的抽象,具体有ConsumeMessageOrderlyService
和ConsumeMessageConcurrentlyService
两种策略。
5. 生产者与消费者的协同设计:
- 异步处理:
使用 异步回调模式 确保消息发送或接收不会阻塞主线程,提高性能。 - 高可用设计:
通过 心跳机制 和 重试机制 保证消费者组和生产者在故障情况下能够恢复。