1、为什么使用MQ,MQ在项目中的作用?
MQ具有解耦、异步、削峰填谷的功能。在本人项目中主要用于单向报文、交易信息登记的异步操作。
2、RocketMQ由哪些角色组成,它们分别由什么作用?
- NameServer : 作为服务协调组件,类似于zookeeper,具有服务注册,服务发现,服务路由的作用。
- Broker : 负责消息的存储、投递和查询。
- Producer : 负责生产消息。
- Consumer : 负责消费消息。
3、RocketMQ消息被消费后会被立刻删除吗?
不会。每条消息都会持久化到commitLog中,消费者消费消息后只是更新消息的消费进度而已。
4、消息会堆积吗?
消息堆积的原因有3个:
- 生产者生产消息过快
- broker消息堆积(顺序消息阻塞)
- 消费者消费消息过慢
5、RocketMQ什么时候删除过期消息?
默认是72小时后删除文件,可以通过配置文件的filereservetime属性更改这个过期时间。
6、消息消费方式是push还是pull?
push和pull都有,push是通过DefaultMQPushConsumer实现的,pull是通过DefaultMQPullConsumer实现的,但是push的底层还是通过pull实现的。
7、broker是如何处理消费者的pull请求的?
broker收到消费者的pull请求后,会先去消息队列中看一下是否有消息,如果有消息会直接返回给consumer,如果没有消息,broker不会断开连接,等待5秒后会再检查是否有消息,不管有没有消息都会返回给消费者。
8、RocketMQ是如何实现负载均衡的?
- 对于生产者来说,生产者发送消息时,会轮询目标topic下所有的消息队列,并且采用递增取模的方式外不同的消息队列上发送消息,使消息均匀地落在消息队列上。
- 对于消费者来说,不同的consumer会通过订阅topic会绑定到对应的消息消息队列中,因为消息是均匀地落在消息队列上的,消费者也会均匀地消费到消息。consumer绑定topic的策略有平均分配策略、轮询分配、一致性hash等等。
9、消息重复消费的原因?
1)发送时消息重复消费:当一条消息发送到broker并完成持久化,如果这时候出现网络闪断或者broker宕机,导致broker对生产者的应答失败,那么生产者会尝试重发消息,导致消费者收到重复的消息。
2)消费消息时重复:当消费者已经完成消费,但是响应给broker时出现网络闪断,为了保证消息至少被消费一次,broker会尝试再次投递消息。
3) 负载均衡是消息重复:当broker或客户端重启、扩容或缩容时,会触发Rebalance,此时消费者可能会消费到重复的消息。
10、如何保证消息幂等?
正常情况下出现消息重复的概率很低,如果由MQ处理,会影响吞吐量和高可用,所以RocketMQ不解决消息重复的问题。消息重复的问题可以通过设置业务的唯一性ID由业务系统自身解决。
11、如何保证消息顺序消费?
将消息依次发送到同一个队列里面。
12、RocketMQ怎么保证消息不丢?
- 对于生产者来说,发送消息失败会自动重试,重试后仍然失败,那么生产者会知道消费没有发送成功,进行业务兜底处理。
- 对于Broker端来说,消息只要到了broker端,会先保存到内存中,然后立刻返回成功给生产者,随后broker定期批量地将消息从内存刷到磁盘上,为避免消息丢失,可将异步刷盘改为同步刷盘;为了保证高可用,broker还会异步将消息同步给slave,可以将异步改为同步,但会影响效率。
- 对于消费者来说,必须完成业务操作后才能响应成功给broker,否者返回稍后重试的响应给broker,然后稍后再重试。
13、RocketMQ是怎么实现高可用的?
- 消息发送高可用:在创建topic的时候,把topic的多个消息队列创建在多个broker上,当一个broker不可用的时候,生产者仍然可以发送消息到其他broker组。
- 消息消费高可用:当broker的master节点不可用的时候,消费者可以从slave节点上获取消费
14、RockerMQ消费的发送方式有多少种?
- 同步消息发送
- 异步消息发送
- 单向消息发送
15、消息堆积会不会进死信队列?
当一条消息消费失败,RocketMQ就会自动进行消息重试。而如果消费失败超过最大重试次数,RocketMQ就会认为这个消息有问题。但是此时,RocketMQ不会立刻将这个有问题的消息丢弃,而会将其发送到这个消费者组对应的一种特殊队列:死信队列。消息堆积说明消息没被消费,因此消息堆积不会进入死信队列。