topic、队列间的对应关系以及orderly与conccrently的差别

首先的明白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,所以并没有保证消费顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值