参考:
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