消息队列_mq消息队列

本文探讨了使用消息队列的必要性,包括异步处理、削峰解耦的优势,以及RabbitMQ、RocketMQ和Kafka的选择。还深入解析了高可用性策略,如单master与多master的区别,以及保证消息不重复消费和可靠传输的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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消息队列过程:

4918cfff10f6fe45bc9d7afa44752c57.png

1) 生产者发送消息给mq服务器,mq服务器确认写入磁盘,返回给生产者成功或失败;

2) 生产者发送方执行本地事务逻辑,commit或callback,

3) 提交后服务端就收到commit,标记事务消息为可订阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值