消息队列_RocketMQ_01_MQ简介

MQ简介

什么是消息队列?

消息队列中间件是分布式系统中重要的组件,它主要解决的问题是:应用解耦、异步消息、流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。
目前使用较多的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

消息即数据。一般消息的体量不会很大。

MQ解决了什么问题?

1. 应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:

image

传统模式的缺点:订单系统与库存系统耦合过高,假如库存系统挂了,暂时无法访问,则订单占库存将失败,从而导致订单创建失败。

如何解决以上问题呢?引入应用消息队列后的方案,如下图:
image

订单系统:用户下单后,订单系统完成持久化处理,将下单的消息写入消息队列,写入成功后返回用户订单下单成功。
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存的相关操作(占库,减库)。
假如:在下单时库存系统不能正常使用。那么也不影响正常下单,因为下单后,订单系统将下单的消息写入消息队列后就不再关心其他的后续操作了,实现订单系统与库存系统的应用解耦。

2. 流量削锋

流量削锋也是消息队列的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:秒杀活动,一般会因为某一时刻流量过大,导致流量激增,应用可能挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
a、可以控制活动的人数
b、可以缓解短时间内高流量压垮应用
image

用户的请求 ---- 服务器接收 ---- 首先写入消息队列

假如消息队列长度超过了所限定的最大请求数量,则直接抛弃一部分用户请求或跳转到错误页面。
秒杀业务根据消息队列中的请求信息,再做后续处理。

3. 日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下
image

日志采集客户端,负责日志数据采集,定时写受写入Kafka队列。
Kafka消息队列,负责日志数据的接收,存储和转发。
日志处理应用:订阅并消费kafka队列中的日志数据。

4. 消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等
点对点通讯:

image

客户端A和客户端B使用同一队列,进行消息通讯。

聊天室通讯:
image

客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

以上实际是消息队列的两种消息模式,点对点或发布订阅模式。

MQ的缺点

1、系统可用性降低。依赖服务也多,服务越容易挂掉。需要考虑MQ瘫痪的情况
2、系统复杂性提高。需要考虑消息丢失、消息重复消费、消息传递的顺序性
3、业务一致性。主业务和从属业务一致性的处理

posted @ 2021-11-12 16:31  失昼  阅读(86)  评论(0)    收藏  举报