1、什么是RocketMQ?
RcoketMQ是一个开源的分布式消息中间件:它支持事务消息、顺序消息、批量消息、定时消息、消息回溯等;
2、RocketMQ的特点有哪些
它是一个队列消息模型的中间件,具有:高可靠、高性能、高实时、分布式等;
它的生产者(producer)与消费者(consumer)都可以做分布式;
能够严格保证顺序消息:
必须保证同一topic,同一线程,同一queue;
支持两种消费模式:(不管是pull和push底层实现都是pull(见源码))
pull: consumer去broker拉取消息
push:broker推给consumer
3、RocketMQ中的角色
namesrv:充当注册中心的作用,可以部署多个,相互之间独立,其他角色同时向多个NameServer机器上报状态信息,从而达到热备份的目的。 NameServer本身是无状态的,也就是说NameServer中的Broker、Topic等状态信息不会持久存储,都是由各个角色定时上报并 存储到内存中的(NameServer支持配置参数的持久化,一般用不到);
4、RocketMQ怎么保证消息不丢失
保证消息不丢失分为三个阶段:
(1)、producer发消息到broker中时,broker给producer一个消息确认回执
(2)、消息到broker后数据进行持久化,持久化方式有两种:同步/异步
(3)、consumer去拉取消息后给broker一个消息确认回执,broker得到确认回执后才认为这条消息被消息掉了
如图:
5、RocketMQ如何处理消息积压
当MQ积压消息时,consumer消费会出现消费不动的情况;所以在处理这个问题之前,应该先保证整个流程的正常流转;
处理步骤:
1)先开一个queue,让producer断开之前的积压queue,往新的queue里发送消息,再让consumer去新的queue里消费,这样就保证了流程的正常流转。
2)新建一个consumer/producer(中转),让它去把积压queue里的消息读出来,然后再开一个queue/临时存储,把从积压队列里的消息读出来转到新queue/临时存储,再让consumer去消费;
如图:
6、RocketMQ如何保证顺序消费
两种情况:
1)(不考虑网络因素)producer发消息到队列时就按顺序发送,队列是保证FIFO的;当然这种情况前提条件是:同一topic、同一queue、同一线程、对应一个消费者;
2)当producer发送消息不能保证顺序时,比如网络波动,消息1先发送,消息2后发送,但因为网络原因,消息2先到队列时这种情况;
处理方案:当消费者读到消息2 后把消息2存到数据库,不执行业务流程;
再去读消息1,当消息1被消费后,从数据库中查消息2的状态,查到有消息2就执行消息2的业务流程,没有查到就不管;(这种业务场景是在必须保证顺序消费的情况下)
如图:
7、RocketMQ重复消费问题
重复消费问题是在queue到消费者之间的,当一条消息被消费者消费后给回执时出现异常(宕机,网络等因素)时,queue没收到消费者的回执,从而导致queue人为这条消息没有被消费,重新发给消费者,这就是重复消费的问题;
解决方案:
当消费者消费掉一条消息后,存储到数据库或者redis中,当消息过来时,先去数据库或者redis中查询这条数据是否被消费过,如果没有消费就消费,如果有就不用管了;