MQ(消息队列)
1.为什么要使用消息队列?
异步,削峰,解耦
1) 异步:达到生产者与消费者的异步,加快运行速度
2) 削峰:采用串行方式,便于数据库的处理
3) 解耦:采用订阅方式,避免代码入侵
2.使用消息队列中间件的缺点?
增加了系统的复杂度,需要解决消息中间件的高可用性
3.消息队列的选型?
RabbitMQ开箱即用,搭建相对简单,适合小公司,性能相对较低。
RocketMQ阿里出品,具有低延迟,高稳定性的特点,对于订单等业务有保证
Kafka针对于大数据,数据量较大,高延时,数据为攒一批发送一批的方式
4.如何保证高可用性?
单master:当一台master宕机,整个服务不可用。
多master:当一台master宕机,这台未被消费的消息无法被订阅,消息实时性会受到影响。
多master多slave异步复制:当一台master宕机,master未被slave复制的消息,会造成部分丢失,毫秒级别,被slave复制的可以被消费。
多master多slave同步双写:当一台master宕机,由于双写,slave消息正常被消费,性能比异步复制低大约10%。
5.如何保证消息不重复被消费?
消息都有返回一个确认标识,比如rocketmq,会返回一个consume_success成功标志;如果由于网络等原因,消息队列不知道消费过该消息,可以进行幂等性处理。
1) 可以通过sql主键的方式,进行判断
2) 可以通过对同一个消息加redis分布式锁,进行判断
6.如何保证消息的可靠性传输?
1) 生产者:生产者发送消息后,会返回一个issuccess确认消息发送成,如果发送失败,通过业务的方式进行处理。
2) 消息队列:服务器接口生产者发送的消息,写入硬盘,同时告知生产者。
3) 消费者:只有消费完一条才能再消费,如发生异常,最大消费5次仍然无法消费,由后台线程继续重试,
消息积压:
1) 设置过期时间,
2) 大量积压,写个程序消费掉,
3) 解决消费者端的问题,恢复
7.如何保证消息的顺序性?
指定同一个topic,以一个id作为对应的key,保证消息按照先进先出的原则来进行发布和消费
MQ消息队列过程:

1) 生产者发送消息给mq服务器,mq服务器确认写入磁盘,返回给生产者成功或失败;
2) 生产者发送方执行本地事务逻辑,commit或callback,
3) 提交后服务端就收到commit,标记事务消息为可订阅。