标题RocketMQ基础知识点
文章目录
-
- 标题RocketMQ基础知识点
- **一.MQ解决了系统中的哪些问题?**
- **二.为什么要用MQ,优缺点**
- **三.为什么不用Kafka、Activemq、Rabbitmq啊,这几个MQ的区别**
- **四.既然你用到了MQ,虽然说达到了异步的目的,但是也出现了一些新的问题,怎么解决这些问题呢?**
- **2.RocketMQ是如何保证高可用的?**
- **3.RocketMQ重复消费问题(怎么保证消息队列消费的幂等性)?**
- **4.RocketMQ如何保证消息的顺序消费?**
- **5.RocketMQ如何解决消息积压问题?**
- **五.如果让你来动手实现一个分布式消息中间件,整体架构你会如何设计实现?**
- **六.补充**
- **1. Master Broker 是如何将消息同步给 Slave Broker 的?**
- **2. 消费者的系统在获取消息的时候,是从 Master Broker 获取的?还是从 Slave Broker 获取的?**
- **3. 如果 Slave Broker 挂掉了,会对整个系统有影响吗?**
- **4. Master Broker 突然挂了,这样会怎么样?**
- **5.基于 Dledger 实现 RocketMQ 高可用自动切换(续上一个问题)**
- **6.RocketMQ延时消息**
- 七.RocketMQ持久化
- rocketmq 刷盘
- 八.RocketMQ保证消息可靠性传输
- 九.重复消费问题
- Name Server
- Broker
一.MQ解决了系统中的哪些问题?
下单的时候,这个RocketMQ充当一个生产者,把商品的信息放到消息队列里面,比如说这个商品ID,价格。下完单了,redis就会做一个预减库存的操作,然后这个时候RocketMQ充当消费者,去扣减数据库里面的库存,RocketMQ起到了一个异步消费订单的作用,避免了缓存和数据库数据不一致的问题。
二.为什么要用MQ,优缺点
优点:
1.通过异步处理提高系统性能(削峰,减少响应所需时间):在项目中,使用消息队列可以有效的抵御大量订单涌入对系统的冲击。如果不使用消息队列的话,用户的请求数据直接写入数据库,在高并发的情况下,数据库的压力会很大,使得响应速度很慢,但如果使用消息队列的话,用户的请求数据会发送给消息队列,然后立即返回,再由消息队列的消费进程从消息队列中获取数据,异步写入数据库,并且消息队列的处理速度比数据库快,响应速度也得到了改善。
2.解耦:解除两个系统的耦合度(下单和库存)凭借中间层,减少两个系统直接调用的耦合度,使用发布-订阅模式工作,生产者发布,消费者订阅,生产者和消费者之间没有直接耦合。
缺点:
1.系统可用性降低:如果消息中间件宕机,或出现异常情况等,下面的消费者系统就会出现数据异常。
2.系统复杂度提高:要考虑加入消息中间件的一系列问题,消息传递的顺序性,消息有没有被重复消费,高可用等问题(这几个问题我下面会解答)
3.数据的一致性问题:消费者没有成功消费信息,导致消息遗漏,从而发生消息不一致的情况。比如:A系统成功就认为请求成功,但是BCD系统,BD成功了,C没成功,可能就导致数据的不一致。
简单说一下数据一致性问题:下单失败无法正确回补库存,因为整个下单是属于一个事务,若果下单成功,会进行减库存的操作(在Redis中),但是之后订单入库或返回前端的过程中失败,会进行事务回滚,之前操作失效,但是Redis异步写入数据库,会导致订单不出现,但是库存会减少,会导致少卖的现象,有可能造成库存堆积。
数据一致性问题解决方法:
1.JobController任务控制器定时去Redis查询延时任务列表。
2.有问题就将任务进行恢复。
3.任务执行成功,表示流程完成,否则下一个周期重试。
三.为什么不用Kafka、Activemq、Rabbitmq啊,这几个MQ的区别
国内采用的MQ有:ActiveMQ、Kafka、RabbitMQ、RocketMQ,但现在ActiveMQ用的越来越少了,所以我介绍一下其他三种MQ。
(一)Kafka:
1、开发语言:Scala开发
2、性能、吞吐量: 吞吐量所有MQ里最优秀,QPS十万级、性能毫秒级、支持集群部署
3、功能:功能单一
4、缺点:丢数据, 因为数据先写入磁盘缓冲区,未直接落盘。机器故障会造成数据丢失
5、应用场景:适当丢失数据没有关系、吞吐量要求高、不需要太多的高级功能的场景,比如大数据场景。
(二)RabbitMQ:
1、开发语言:Erlang开发
2、性能、吞吐量: 吞吐量比较低,QPS几万级、性能u秒级、主从架构
3、功能:功能单一
4、缺点: Erlang小众语言开发,吞吐量低,集群扩展麻烦
5、应用场景:中小公司对并发和吞吐量要求不高的场景。
(三)RocketMQ:
1、开发语言: java开发
2、性能、吞吐量: 吞吐量高,QPS十万级、性能毫秒级、支持集群部署
3、功能:支持各种高级功能,比如说 延迟消息、事务消息、消息回溯、死信队列、消息积压等等
4、缺点:官方文档相对简单可能是RocketMQ目前唯一的缺点
5、应用场景:适当丢失数据没有关系、吞吐量要求高、不需要太多的高级功能的场景,比如大数据场景。
四.既然你用到了MQ,虽然说达到了异步的目的,但是也出现了一些新的问题,怎么解决这些问题呢?
1. 首先说说消息中间件实现异步,首先你要