文章目录
一. 读写队列,是在路由时使用
在消息发送时,根据写队列个数返回路由信息,而消息消费时按照读队列个数返回路由信息。
二. 在物理文件层面,只有写队列才会创建文件
举个例子:写队列个数是8,设置的读队列个数是4. 这个时候,会创建8个文件夹,代表0 1 2 3 4 5 6 7,但在消息消费时,路由信息只返回4,在具体拉取消息时,就只会消费0 1 2 3这4个队列中的消息,4 5 6 7中的信息压根就不会被消费。
反过来,如果写队列个数是4,读队列个数是8,在生产消息时只会往0 1 2 3中生产消息,消费消息时则会从0 1 2 3 4 5 6 7所有的队列中消费,当然 4 5 6 7中压根就没有消息 ,假设ConsumerGroup有两个消费者,事实上只有第一个消费者在真正的消费消息(0 1 2 3),第二个消费者压根就消费不到消息。
三. 只有readQueueNums>=writeQueueNums,程序才能正常进行
最佳实践是readQueueNums=writeQueueNums。那rocketmq为什么要区分读写队列呢?直接强制readQueueNums=writeQueueNums,不就没有问题了吗?rocketmq设置读写队列数的目的在于方便队列的缩容和扩容。