RocketMq源码分析用到的设计模式

📤 生产者(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. 生产者与消费者的协同设计:
  • 异步处理:
    使用 异步回调模式 确保消息发送或接收不会阻塞主线程,提高性能。
  • 高可用设计:
    通过 心跳机制 和 重试机制 保证消费者组和生产者在故障情况下能够恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值