首先的明白rocketmq服务端,一个Topic会对应多个message queue,然后在rocketmq客户端(springboot项目)中,也有一个内存队列的概念,且内存队列和message queue是一一对应的,即:有几个message queue,就有几个内存队列。
为什么要有内存队列?内存队列是用于暂存从rocketmq服务端拉取到的消息,我们要知道并不是说客户端消费一条消息,才从服务端拉取它一次。客户端为了节约宽带,可能一次拉取时,会拉取多条消息下来,然后暂存到内存队列中。
举个例子:
Topic01中有两个队列,message queue01、message queue02,然后该Topic01只有一个消费者客户端,所以该消费者会消费两个队列,此时者两个队列分别会在客户端中对应两个内存队列,即,message queue01 -》 内存队列01、message queue02 -》内存队列02。然后客户端一次从message queue01中拉取消息时,可能会一次拉取20条,然后存储在 内存队列01中。
ps:一次拉取多条,也可以保证消息的顺序,因为一个message queue只会有一个消费者的一个线程处理,只有当前线程处理完多个消息后,才能继续向message queue拉取新的消息,彼时,message queue中的消息不会被其他人给拉取到
一个基本准则:在任何情况下,一个内存队列都只能由一个唯一的消费者线程消费,也就是说一个内存队列不会被多个线程消费,内存队列和消费线程之间也是一对一的关系
至于消费者orderly模式和concurrently模式的区别:他们的区别在于消息重试时的差别,orderly:消息消费异常或超时后,当前消费者线程会继续消费该条消息,直到成功为止。不会跳过该条消息,马上消费下一条消息
concurrently:消息消费异常或超时后,当前消费者线程不会继续消费该条消息,而是会跳过该条消息,马上消费下一条消息。然后可能等之后某个时间点,这条失败的消息重新入队列后,再继续被当前消费者线程消费。
举个例子:
现在有一个messagequeue,然后里面有两条消息,按照存储顺序分别是 a、b
orderly:消费a失败后,会一直消费a,直到a消费成功,才继续消费b。消费顺序a -》 b,所以严格保证了消费顺序
concurrently:消费a失败后,跳过a,马上消费b,等b消费完后,a重新入队列了,然后再消费a。消费顺序:b -》 a,所以并没有保证消费顺序


被折叠的 条评论
为什么被折叠?



