相关概念:
producer:消息发送
consumer:消费者实例, 一个conumer实例可以有多个消费者线程.
shardingkey:消息路由, 根据sharding key路由保存到哪个queue(默认好像是16个queue).
queue:物理存储消息的地方
顺序消息需要做的地方:
- 发送端需要用OrderProducer, send消息的时候需要给shardingkey.
- 消费端要用OrderConsumer.
顺序消息和producer和consumer有关,和创建的topic的消息类型无关(测试结果是这样, 不知道其他方面有没有区别).
16个queue会均匀分配给多个consumer实例, 每个consumer实例下面的consumer thread再分配每一个queue, queue和consumer thread的关系是N:1关系,即一个consumer thread可以对应1到多个queue, 一个queue只能对应一个consumer thread. 但queue和consumer thread不是绑死关系,从测试结果看:从queue中取出一条消息扔进consumer thread pool, 执行结束后再取queue中下一条消息.
如16个queue, 起了2个consumer, 那么每个consumer会分到8个queue, 如果每个consumer下面有10个线程,那么在一个时刻每个consumer只有8个线程有工作,其他2个线程空闲等待调度. 如果每个consumer下面只有4个线程, 那么每个线程就会大概对应2个queue.
rocketmq支持动态的consumer实例扩容缩容, 中间切换的时间大概在30S~60S.