消息队列:1.认识篇

介绍

消息队列,顾名思义,存放消息(可类比为请求)的队列(一种先进先出的数据结构)。
其是一种常用于分布式系统的中间件,可以在不同的应用程序、服务或系统之间传递消息,并且常用于解耦合不同部分的系统,使得系统更加可扩展和灵活。
基本原理:发送者将消息放入队列,接收者从队列中获取消息并处理。
消息队列实质是一种方式,一种在不同组件之间传递消息的通信方式。发送者和接收者之间不需要直接通信,它们只需了解如何发送和接收消息即可。

作用与优点

由上述内容,可推断出消息队列的一些作用:

  • 解耦:发送者和接收者只需要关心发送消息和接受消息,不用关心彼此。
  • 异步:发送者不关心消息的处理,即不用等待消息的响应,故支持异步。
  • 削锋:某些活动的流量过大、请求过多,可能导致系统宕机;消息队列可以作为缓冲区,将这些请求暂时存储起来,以避免瞬时高流量,然后按照系统处理能力逐步消费,实现流量的平滑处理,从而降低系统的压力,避免宕机。
    以及其身为分布式系统的固有优点:
  • 可扩展性:在解耦后,可方便地单独对发送者或接收者或消息队列进行动态伸缩。
  • 可靠性:由于消息队列允许多个消费者和生产者,并且通常支持消息持久化和复制,因此即使其中一个组件出现故障,系统仍然可以继续运行并且消息也不会丢失。

适用场景

(此处仅介绍一些常见场景)

异步场景举例:用户注册

需求

用户注册后需向其发送注册邮件和注册短信。

设计

用户注册后,将注册信息写入数据库;发送注册邮件;发送短信。
如不使用消息队列,不进行异步解耦,即注册服务器需要同步远程调用写入数据库、发送注册邮件、发送短信的三个函数,将与其他应用发生多次交互,同时还得等待响应,假设一个操作需要0.5s,则该操作会占用注册服务器一个线程的1.5s。
使用消息队列后,注册服务器直接向消息队列中写入三个消息(数据库写入消息、邮件发送消息、短信发送消息),并且是异步发送不用等待返回,假设一次发送消息为0.1s,也仅需0.3s。

解耦场景举例:订单-库存管理

需求

用户下订单后,库存系统需要减少相对数量。

设计

用户下单后,订单系统需要通知库存系统。

详细设计

  • 原设计:订单系统调用库存系统的接口。
    • 存在缺陷:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;订单系统依赖库存系统接口,存在耦合。
  • 使用消息队列改进:订单系统发送订单消息(用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功),库存系统读取订单消息并自行处理(订阅订单消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作)。
    • 解决缺陷:假如库存系统无法访问,订单系统仅需要发送消息,可保持运转;订单消息仅发送消息,消息解读由库存系统进行(发布-订阅或消息队列模式),降低耦合度。

削锋场景举例:秒杀活动

需求

在秒杀活动中,大量用户同时抢购商品,可能会导致系统压力激增。为了应对这一情况,需要一种机制来平稳处理激增的请求流量,避免系统崩溃或性能下降。

设计

传统的处理方式可能会导致系统崩溃或性能下降。为了解决这个问题,可以使用消息队列来削峰填谷。

详细设计

  1. 秒杀活动开始:当秒杀活动开始时,用户可以提交秒杀请求。
  2. 请求入队:订单系统接收到用户的秒杀请求后,将请求消息写入消息队列,而不是立即处理。
  3. 消息处理:秒杀请求消息被消息队列按照一定的规则(如先进先出)分发给后端处理程序。
  4. 后端处理:后端处理程序逐条处理消息,检查库存并进行相应的处理(如减少库存、生成
    订单等)。

以此消息队列可平滑处理激增的请求流量,避免系统因突发流量而崩溃。

日志处理场景

需求

需要一种解决大量日志传输和实时处理的方案,以便对日志数据进行分析和可视化展示。

设计

设计一个分布式日志处理系统,包括以下组件:

  1. 日志采集客户端:负责从各个日志源采集日志数据,并将数据定期写入消息队列中。
  2. 消息队列:接收来自日志采集客户端的日志数据,负责数据的存储和转发。
  3. 日志处理应用:订阅并消费Kafka队列中的日志数据,进行实时处理和分析。
  4. Logstash:作为日志处理应用的一部分,负责对原始日志进行解析和转换,统一输出为JSON格式的数据。
  5. Elasticsearch:作为日志处理应用的核心数据存储服务,接收Logstash处理后的JSON格式日志数据,实现实时的数据索引和查询。
  6. Kibana:基于Elasticsearch 的数据可视化组件,用于将Elasticsearch中的数据进行可视化展示和分析。

消息通讯场景

需求

需要一种高效的消息通讯机制,可以用于点对点通讯或者创建聊天室等场景,以实现实时的消息传递和交流。

设计

设计一个基于消息队列的消息通讯系统,包括以下两种场景:

  1. 点对点通讯:客户端A和客户端B使用同一队列进行消息通讯;消息队列负责接收和转发客户端A和客户端B的消息。
  2. 客户端A、客户端B等多个客户端订阅同一主题:当有客户端发布消息时,消息队列将消息广播给所有订阅了该主题的客户端,客户端收到消息后进行展示。

常用消息队列框架

  1. RabbitMQ:RabbitMQ 是一个开源的消息队列系统,实现了高级消息队列协议(AMQP),它是一个可靠、高可用、可扩展的消息代理。RabbitMQ提供了多种消息传递模式,如点对点、发布/订阅等,适用于各种场景的应用程序。
  2. RocketMQ:RocketMQ 是阿里巴巴开源的分布式消息队列系统,具有高吞吐量、低延迟、高可用性等特点。它支持丰富的消息模型,包括顺序消息、事务消息等,适用于大规模分布式系统的消息通信。
  3. Kafka:Kafka是由Apache软件基金会开发的分布式流处理平台和消息队列系统。Kafka设计用于支持大规模的消息处理,具有高吞吐量、持久性、分区等特点,广泛应用于大数据领域。
  4. ActiveMQ:ActiveMQ 是一个开源的消息中间件,实现了JavaMessageService(JMS)规范。它支持多种传输协议,如TCP、UDP、SSL等,提供了丰富的功能,包括消息持久化、事务支持等。
  5. Amazon SQS:AmazonSQS(Simple Queue Service)是亚马逊提供的消息队列服务,可帮助构建分布式应用程序。它具有高可用性、可扩展性、灵活性等特点,适用于构建在亚马逊云平台上的应用程序。

消息队列:1.认识篇
http://shoumingchilun.github.io/2024/03/13/backend/middleware/messagequeue/mq-introducte/
作者
寿命齿轮
发布于
2024年3月13日
许可协议