(1)什么是mq?
- MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
- 系统之间不需要直接去相互调用,比如rpc技术,它们通过消息发送来传递
- 系统通过队列来通信。
(2)使用mq的三种常见场景,即为什么要使用mq这个技术?还可以说mq有哪些优点好处?
-
系统耦合度过高,代码维护费时费力。
- 场景:多个系统需要A系统去发送一个数据,导致A系统需要分别对每个系统去调用它们的api接口,
- 还得考虑接口的入参,
- 还有考虑容错重发机制。即其他系统挂掉,调用api接口失败。
- 如果某些系统不需要传递的数据了,a系统还必须取消对api接口的调用。
- 如果数据的类型改变了。
- 解决方式:使用mq消息队列。把a系统发送数据-作为消息的生产者。其他各个系统作为消息的消费者。a系统只需要把消息传递到mq队列。需要数据的消费者直接去mq里进行消息的获取消费即可。pub/sub模型。
- 场景:多个系统需要A系统去发送一个数据,导致A系统需要分别对每个系统去调用它们的api接口,
-
同步高延时
- 场景:在一个功能里,分为几个耗时的同步顺序执行的操作。并且这些操作允许异步处理。
- 解决方式:
- 场景:在一个功能里,分为几个耗时的同步顺序执行的操作。并且这些操作允许异步处理。
-
削峰填谷
- 场景:在请求量过高,且大量的对数据库进行操作。在数据库qps过低,满足不了这种高并发访问环境下,就很有可能mysql宕机挂掉。
- 解决方式:
- 场景:在请求量过高,且大量的对数据库进行操作。在数据库qps过低,满足不了这种高并发访问环境下,就很有可能mysql宕机挂掉。
(3)mq的缺点?mq会出现什么问题?
- 系统可用性降低:原本是几个系统间的相互调用,加入mq,如果mq挂掉,整个系统就是崩掉了。
- 系统复杂性变高:消息的重复消费问题。消息丢失问题。消息传递的顺序性。
- 会出现一致性问题:A系统处理完成功返回响应。但是其他消费系统有可能处理数据失败。这就有可能会出现数据不一致问题。
(4)几种常见的mq中间件有什么区别,优缺点聊聊。
(5)解决引入mq可用性降低问题,或者说如何保证mq的高可用(HA)?
- 首先,需要明确是哪个消息中间件。
- 然后再说怎么保证你所说的mq中间怎么保证高可用。
- rabbitmq的高可用分析:采用镜像集群配置:对rabbitmq搭建集群,并配置镜像队列策略。
分布式部署:https://baijiahao.baidu.com/s?id=1709437436653702219&wfr=spider&for=pc
分布式原理和实现以及故障分析:https://blog.csdn.net/qq_34224565/article/details/115317003 - kafka的高可用分析:
(6)重复消费问题怎么解决?或者说如何保证消息的幂等性?
- rabbitMQ保证消息幂等性:乐观锁保证数据库层面修改操作,或者使用消息记录的唯一标识,消费消息之前根据业务提供的key查redis缓存,如果不存在,就消费消息,消费消息成功后使用唯一key存入redis中,做记录。否则如果存在,则不消费。
- kafka保证消息幂等性:其实跟上面的rabbitMQ类似,都是要在一个地方存储该消息的消费记录。
(7)消息丢失问题怎么解决?或者说如何保证消息的可靠性传输?
- rabbitMQ
- kafka:https://www.yuque.com/books/share/327d9543-85d2-418f-9315-41c3e19d2768/fcead2579b7a683bd1739fd2b84ef83d
(8)怎么保证消息的顺序性?
- rabbitMQ:
- 单队列(完全有序):一个队列对应一个消费者,并且需要保证顺序性的消息send给同一个队列。
- 多队列(部分有序):首先保证有序的消息必须发送给同一个队列。不保证有序的情况使用多个队列。其次一个队列对应一个消费者
- kafka:https://zhuanlan.zhihu.com/p/372469047
- 就是使用一定的策略对需要保证有序性的消息发送给同一个partition,在发送给消费者之后,再使用相同的策略,把消息发送给同一个内存队列,该内存队列只交由一个线程去执行。这样就保证了一致性。
- 就是使用一定的策略对需要保证有序性的消息发送给同一个partition,在发送给消费者之后,再使用相同的策略,把消息发送给同一个内存队列,该内存队列只交由一个线程去执行。这样就保证了一致性。
(9)如何解决消息队列的延时和失效问题?消息队列满了该怎么处理?消息积压怎么处理?
也可以通过死信队列,处理延时和失效问题(重新入队列,或者即时处理,或者记录到数据库延后处理。)