RocketMQ 生产端与消费端

发布时间 2023-07-24 17:52:27作者: archaique

参考:

en_oc:https://www.cnblogs.com/enoc/p/rocketmq-so-no-roku.html

田守枝(rebalance):https://cloud.tencent.com/developer/article/1554950

官方文档:https://rocketmq.apache.org/zh/docs/

 

 

发送消息

RocketMQ中定义了如下三种消息通信的方式:

  • SYNC:同步发送,生产端会阻塞等待发送结果;
    • 应用场景:这种方式应用场景非常广泛,如重要业务事件通知。
  • ASYNC:异步发送,生产端调用发送API之后,立刻返回,在拿到Broker的响应结果后,触发对应的SendCallback回调;
    • 应用场景:一般用于链路耗时较长,对 RT 较为敏感的业务场景;
  • ONEWAY:单向发送,发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。 此方式发送消息的过程耗时非常短,一般在微秒级别;
    • 应用场景:适用于耗时非常短,对可靠性要求不高的场景,如日志收集。

Producer 队列选择

RocketMq中所有关于生产者和消费者的代码都在client包下。打开源码,可以看到Procuder下有个selector包

RocketMq提供了3种不同的选择队列方式:

  • SelectMessageQueueByHash
  • SelectMessageQueueByMachineRoom
  • SelectMessageQueueByRandom

它们都实现了 MessageQueueSelector 接口,可以自己实现这个接口,定义自己的队列选择方式

那么默认机制是哪一种呢?

默认选择方式是轮询

消费端负载均衡策略

在 Rocket MQ 5.0 之前,仅支持队列粒度的负载均衡

  • 消息粒度负载均衡:5.0 及以后 PushConsumer和SimpleConsumer默认且仅使用消息粒度负载均衡

  • 队列粒度负载均衡:5.0 及以后的 PullConsumer默认负载策略。对于历史版本(服务端4.x/3.x版本)的消费者,包括PullConsumer、DefaultPushConsumer、DefaultPullConsumer、LitePullConsumer等,默认且仅能使用队列粒度负载均衡策略。

队列粒度负载均衡

同一消费者分组内的多个消费者将按照队列粒度消费消息,即每个队列只能被一个消费者消费(每个消费者可消费多个队列)。

 

 

 

Rebalance (消费端队列分配)

Rebalance(再均衡)机制指的是:将一个Topic下的多个队列(或称之为分区),在同一个消费者组(consumer group)下的多个消费者实例(consumer instance)之间进行重新分配。

 

消费消息

Consumer主要提了下面三种消费策略

  • CONSUME_FROM_LAST_OFFSET

这是Consumer默认的消费策略,它分为两种情况,如果Broker的磁盘消息未过期且未被删除,则从最小偏移量开始消费。如果磁盘已过期,并被删除,则从最大偏移量开始消费。

  • CONSUME_FROM_FIRST_OFFSET

从最早可用的消息开始消费

  • CONSUME_FROM_TIMESTAMP

从指定的时间戳开始消费,这意味着在consumeTimestamp之前生成的消息将被忽略

DefaultLitePullConsumer(拉)

Assign

 

Subscribe

DefaultMQPushConsumer(推)