消息队列学习

消息队列的本质就是一种先进先出的数据结构

使用在分布式开发中,常见的应用场景:解耦、异步、削峰

1、为什么要使用消息队列?

解耦:开发中追求高内聚低耦合,系统的耦合度越高,容错率就越低。也就是一个系统中一个子系统出现了问题,会影响其他子系统

异步:如果用户对A系统发起请求后,A系统需要去调用BCD系统,如果A系统对用户的响应不需要BCD系统的返回数据,那么如果不适用MQ,A系统会依次请求BCD系统,直到全部请求完后,将数据返回个用户,如果使用MQ,A系统发送3条信息分别请求BCD系统并存储到MQ中,后直接响应用户的请求,这样速度会快很多,但是如果A系统对用户的响应需要BCD系统的返回值时就不能使用MQ,需要A系统依次请求BCD系统。

流量削峰:比如秒杀情况,在很短的时间内有大量的请求,这样可能会把系统压垮,如果使用MQ,数据库每秒只能处理2000个请求,但是每秒有5k个请求,那么就可以使用MQ进行流量削峰,将每秒的5k个请求放在MQ中,让系统每次拉取2k个请求,这样就不会将系统压垮。流量削峰的经济考量:如果平时QPS是1k流量最高峰是1w,如果应对高峰配置高性能的服务器是不划算的,所以使用MQ对峰值流量削峰。

2、各种消息队列产品的比较?

常见的几种MQ:actionMQ、RocketMQ、RabbitMQ、kafka

 3、消息队列的优点和缺点?

优点:解耦、异步、削峰

缺点:系统可用性降低、系统复杂度提高、一致性问题

系统可用性降低:MQ一旦宕机,系统就不能运行了

系统复杂度提高:以前系统是同步的远程调用,现在是通过MQ进行异步调用

一致性问题:A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B、C处理成功,D系统处理失败。就会导致一致性问题。 

4、如何保证消息队列的高可用

使用集群,一个MQ可能宕机,那就设置多个MQ

 5、如何保证消息不丢失?

 

 6、如何保证消息不被重复消费?如何保证消息消费的幂等性?

  1. 消费发送者发送消息时携带一个全局唯一的消息id
  2. 消费者获取消费后先根据id在redis、db中查询是否存在消费记录
  3. 如果没有消费过就正常消费,消费完毕后写入redis、db
  4. 如果消息消费过就直接舍弃

消息重复的原因:网络不可达,不可避免的

幂等性:消息携带全局id,消费方接收到消息时先查再处理,根据全局ID做判重处理

7、如何保证消息消费的顺序性?

消息有序指的是可以按照消息的发送顺序来消费

全局顺序消费:

生产者:MQ:消费者 == 1:1:1

采用局部顺序消费:

  1. 生产者根据消息ID将同一组消息发送到一个消息队列中
  2. 多个消费者同时获取消息队列中的消息进行消费
  3. MQ使用分段锁保证每个消息队列中的消息被消费者有序执行

保证顺序性能上一定会受到影响,所以在项目设计的时候要考虑是否对顺序性有高的要求

8、基于MQ的分布式事务实现

(本质上来说,就是保证不同数据库的一致性)

  1. 用户提交订单
  2. 库存服务操作数据库DB,减库存
  3. 订单服务操作订单DB,生成订单信息
  4. 库存服务和订单服务要目同时完成要么同时失败(要保证数据的一致性)

 总结:

消息发送方处理完业务逻辑之后保存本地消息到本地数据库,此时消息状态为type=1为未处理状态,之后发送消息到MQ,消息消费方监听MQ,判断MQ中的消息是否重复,重复则丢弃,如果消息非重复就执行业务逻辑,业务处理完毕后将消息记录到本地数据库,后发送通知消息到MQ,相当于告诉消息发送方已经处理完消息,发送方的消息监听如果监听到消费方发送的通知就将消息状态改为type=2(已处理),如果发送方一直没有监听到消费方发送的通知消息,就通过定时任务向MQ再次发送type=1的消息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值