本文最后更新于 2024-04-21,欢迎来到我的Blog! https://www.zpeng.site/

消息中间件MQ

1、简介

MQ,即Message Queue(消息队列),是一种在应用程序之间传递消息的中间件技术。它允许分布式系统中的不同组件通过发送和接收消息来异步通信,从而实现解耦和提高系统性能。消息队列通常遵循先进先出(FIFO)的原则,即先发送的消息先被消费。

2、组成

消息中间件是一种在分布式系统中用于应用程序之间传递消息的软件系统。它通常由以下几个基本组成部分构成:

  1. 消息服务器(Broker):作为服务器提供消息核心服务,负责维护消息队列和主题,处理消息的接收和分发。

  2. 消息生产者(Producer):业务的发起方,负责生产消息并将其发送到Broker。

  3. 消息消费者(Consumer):业务的处理方,负责从Broker获取消息并进行业务逻辑处理。

  4. 主题(Topic):在发布/订阅模式下,消息统一汇集的地方,不同生产者向Topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播。

  5. 队列(Queue):在点对点模式下,特定生产者向特定Queue发送消息,消费者订阅特定的Queue完成指定消息的接收。

  6. 消息体(Message):根据不同通信协议定义的固定格式进行编码的数据包,封装业务数据,实现消息的传输。

3、通信模式

消息中间件的通信模式主要有两种基本类型:点对点(Point-to-Point,简称PTP)模式和发布/订阅(Publish/Subscribe,简称Pub/Sub)模式。此外,还有一些其他模式,如优先级队列、延迟队列、广播消费、消息回溯、消息堆积与持久化等。

  1. 点对点(PTP)模式

    • 在这种模式下,消息生产者将消息发送到队列(Queue)中,然后消息消费者从队列中取出并消费消息。通常情况下,一个消息只能被一个消费者消费,一旦被消费,消息就从队列中移除,不会再次被消费134

  2. 发布/订阅(Pub/Sub)模式

    • 在这种模式下,消息生产者将消息发布到主题(Topic)中,而消息消费者则订阅感兴趣的主题。发布到主题的消息会被所有订阅了该主题的消费者消费,因此可以实现一对多的消息传递134

  3. 其他通信模式

    • 优先级队列:消息根据优先级进行消费,高优先级的消息会优先被消费。

    • 延迟队列:消息在发送到队列后并不会立即被消费,而是等待设定的延迟时间后才会消费。

    • 广播消费:在发布订阅模型中,所有订阅者都能接收到发布的消息,实现广播效果。

    • 消息回溯:消息在消费后,仍然可以被重新消费,通常用于问题诊断或数据恢复。

    • 消息堆积与持久化:消息中间件能够存储大量未消费的消息,并且可以持久化存储以避免数据丢失345

在选择消息中间件的通信模式时,需要根据具体的业务需求和场景来决定使用哪种模式。例如,如果需要确保消息只被消费一次,可以选择PTP模式;如果需要让多个订阅者都收到消息,则可以选择Pub/Sub模式。其他模式则可以根据特定需求选择使用。

4、优势

消息中间件在分布式系统中扮演着重要的角色,其优势主要体现在以下几个方面:

  1. 应用解耦:消息中间件可以使得不同的应用组件或服务无需知道彼此的具体实现细节,只需要通过消息传递进行通信,从而降低了系统间的耦合度。

  2. 异步通信:消息中间件允许应用组件异步交换消息,这意味着生产者可以继续执行其任务,而不必等待消费者处理消息,从而提高了系统的整体效率。

  3. 流量削峰:在高流量时段,消息中间件可以平滑处理流量峰值,通过在队列中缓存消息,避免系统因流量突增而崩溃。

  4. 可扩展性:消息中间件支持系统在运行时动态地添加或移除消费者,从而方便系统扩展以适应不同的负载需求。

  5. 容错性和可靠性:通过持久化消息和确认机制,消息中间件确保消息不会因为网络问题或服务故障而丢失,提高了消息传递的可靠性。

  6. 消息顺序性保证:在某些场景下,消息中间件可以保证消息的顺序性,确保消息按照发送的顺序被消费。

  7. 灵活性和多样性:消息中间件支持多种通信协议和数据格式,可以适应不同的业务场景和需求。

  8. 支持分布式事务:消息中间件可以与分布式事务机制结合使用,保证消息处理的原子性,要么全部成功,要么全部失败。

  9. 易于维护和监控:消息中间件通常提供维护和监控工具,帮助开发者跟踪消息的流动,及时发现和解决问题。

  10. 提高系统可用性:通过集群和高可用性配置,消息中间件可以在部分节点出现故障时继续运行,从而提高整个系统的可用性。

  11. 数据一致性:在分布式系统中,消息中间件可以协调不同服务之间的数据一致性,特别是在微服务架构中,它可以帮助实现服务间的同步或异步通信。

  12. 降低复杂性:消息中间件抽象了底层通信细节,开发者可以专注于业务逻辑的实现,而不必处理底层的通信和网络编程。

  13. 支持复杂的业务流程:在需要多个服务或组件协作完成的复杂业务流程中,消息中间件可以简化流程的设计和实现。

  14. 提升性能:通过使用消息中间件,可以将密集的计算任务分布到不同的处理单元,从而平衡负载并提升系统性能。

  15. 简化系统设计:消息中间件提供了一种简单的通信机制,可以简化系统设计,使得系统更加模块化。

综上所述,消息中间件通过提供异步通信、解耦、流量控制和可靠性等特性,极大地增强了分布式系统的灵活性、可维护性和可扩展性。

5、使用场景

消息中间件在分布式系统中的使用场景非常广泛,主要包括但不限于以下几个方面:

  1. 异步处理:在业务流程中,通过将非核心的业务逻辑异步化,可以显著提高系统响应速度和吞吐量。例如,用户注册后发送欢迎邮件或短信通知,这些操作可以异步执行,从而不会阻塞用户的主流程。

  2. 应用解耦:消息中间件可以降低系统组件之间的耦合度,使得各个组件可以独立部署和扩展。例如,订单系统和库存系统之间的交互,可以通过消息队列来解耦,订单系统只需发送一个包含订单信息的消息到队列,库存系统根据消息进行库存变更,两者不需要直接通信。

  3. 流量削峰:在面对流量高峰时,如促销活动或大量用户请求,消息中间件可以作为缓冲,平滑流量峰值,防止系统过载。例如,双11秒杀活动,用户请求首先写入消息队列,系统根据队列中的请求信息逐步处理,避免系统崩溃。

  4. 消息通讯:消息中间件可用于系统间的数据通信,实现点对点或发布/订阅的消息传递模式。适用于如聊天室、即时通讯等场景,允许系统间进行高效的数据交换。

  5. 日志处理:在日志收集系统中,消息中间件可以集中收集分布式系统中的日志数据,用于后续的日志分析和监控。

  6. 数据流处理:对于需要实时或批量处理的数据流,如用户行为分析、实时计算等,消息中间件可以作为数据管道,高效地传输和处理大量数据。

  7. 过载保护:在系统面临大量请求时,消息中间件可以作为缓冲,防止系统因超负荷而崩溃,确保系统稳定运行。

  8. 异常恢复:当系统中某个组件出现故障时,消息中间件可以保证消息不会丢失,待系统恢复后继续处理,提高系统的容错性。

  9. 缓冲:在系统中存在处理时间不同的元素时,消息中间件可以作为缓冲层,帮助任务高效执行,优化数据流经过系统的速度。

  10. 分布式事务处理:在需要保证多个服务间数据一致性的场景中,消息中间件可以协调分布式事务,确保事务的原子性。

  11. 蓝绿部署:在进行系统升级时,消息中间件可以帮助实现蓝绿部署,通过控制消息流向来切换新旧系统,减少部署风险。

  12. 限流控制:在下游服务处理能力有限的情况下,消息中间件可以作为一个“漏斗”,控制数据流入速率,防止下游服务被压垮。

这些场景展示了消息中间件在提升系统性能、增强系统稳定性、实现系统解耦以及优化用户体验等方面的重要作用。在实际应用中,根据具体业务需求选择合适的消息中间件并设计合理的架构是至关重要的。

6、常用协议

消息中间件在分布式系统中扮演着重要角色,它们通过不同的协议来实现消息的传递和处理。以下是一些常用的消息中间件协议:

  1. AMQP (Advanced Message Queuing Protocol):AMQP 是一个提供统一消息服务的应用层标准高级消息队列协议,是一个开放标准,为面向消息的中间件设计。它允许客户端与消息中间件传递消息,不受不同产品和开发语言的限制。AMQP 支持多种消息模型,包括点对点和发布/订阅,并且具有可靠性和通用性的优点。

  2. MQTT (Message Queuing Telemetry Transport):MQTT 是由 IBM 开发的一个即时通讯协议,适用于物联网环境。它支持所有平台,能够在低带宽和不稳定网络条件下工作,适合用作传感器和致动器的通信协议。MQTT 以轻量、简单、快速传输而著称,但不支持事务和持久化。

  3. STOMP (Streaming Text Orientated Message Protocol):STOMP 是一个简单文本协议,为 MOM 设计,提供可互操作的连接格式,允许客户端与任意 STOMP 消息代理进行交互。STOMP 协议简单且容易实现,客户端可以通过简单的文本命令与消息代理进行通信。

  4. XMPP (Extensible Messaging and Presence Protocol):XMPP 是基于 XML 的协议,主要用于即时消息和在线状态探测。它允许服务器之间的准即时操作,并且可以发送即时消息,即使在不同的操作系统和浏览器之间也能工作。XMPP 具有通用性、兼容性、可扩展性和安全性,但XML编码格式可能占用较多带宽。

  5. 自定义协议:某些特殊框架(如 Redis、Kafka、ZeroMQ 等)根据自身需求,基于 TCP/IP 自行封装了一套协议,通过网络 socket 接口进行传输,实现了 MQ 的功能。这些协议可能不遵循传统的 MQ 规范,但能够满足特定场景的需求。

  6. JMS (Java Message Service):JMS 是一个 Java 平台的 API,用于在应用程序之间或分布式系统中发送消息,进行异步通信。JMS 定义了点对点和发布订阅两种消息模型,与 AMQP 相比,JMS 更侧重于 Java 语言的实现,而 AMQP 是跨语言的协议。

这些协议各有特点,根据不同的业务需求和场景,可以选择最合适的消息中间件协议来实现系统之间的有效通信。

7、常见工具

常见的消息队列(MQ)工具包括:

  1. Apache Kafka:一个分布式流处理平台,主要用于构建实时数据管道和流式应用程序。它以高性能、高吞吐量和分布式特性而闻名。

  2. RabbitMQ:一个开源的消息代理,支持多种消息协议,如AMQP,STOMP,MQTT等。它以易用性、可靠性和灵活的路由功能而受到欢迎。

  3. ActiveMQ:Apache项目下的开源消息服务器,支持JMS和多种跨语言的客户端和协议。它适用于需要多种语言和平台支持的企业级集成场景。

  4. RocketMQ:由Alibaba开源的分布式消息中间件,特别设计用于高吞吐量和低延迟的场景,尤其在电商大促等流量高峰期间表现出色。

  5. Redis Streams:Redis提供的一个新的特性,允许用户在Redis中实现消息队列的功能。它轻量级且易于使用,适合小型到中型的消息传递需求。

  6. Amazon SQS (Simple Queue Service):AWS提供的一个托管服务,允许用户在分布式系统中传递和处理大量消息。

  7. Google Cloud Pub/Sub:Google Cloud提供的服务,允许用户在不同的服务和应用程序之间发送和接收消息。

  8. Azure Service Bus:Microsoft Azure提供的消息队列服务,支持复杂的业务流程和企业级集成。

  9. IBM MQ:IBM提供的一个消息队列系统,适用于企业级应用,支持跨平台和跨语言的消息传递。

  10. ZeroMQ:一个高性能的异步消息库,常被用作消息队列系统,它专注于简单和高性能,适合构建分布式或并行应用程序。

这些工具各有特点,选择哪个工具通常取决于具体的业务需求、技术栈兼容性、性能要求和运维能力。

8、比较

特性

Kafka

RocketMQ

RabbitMQ

ActiveMQ

单机吞吐量

10万级

10万级

万级

10万级

开发语言

Scala

Java

Erlang

Java

高可用

分布式

分布式

主从

分布式

消息延迟

ms级

ms级

us级

ms级

消息丢失

理论上不会丢失

理论上不会丢失

消费模式

拉取

推拉

推拉

 

持久化

 

文件

内存,文件

内存,文件,数据库

支持协议

自定义协议

自定义协议

AMQP,XMPP, SMTP,STOMP

AMQP,MQTT,OpenWire,STOMP

社区活跃度

管理界面

 

web console

一般

部署难度

 

 

部署方式

独立

独立

独立

独立,嵌入

成熟度

成熟

比较成熟

成熟

成熟

综合评价

优点:拥有强大的性能及吞吐量,兼容性很好。
缺点:由于支持消息堆积,导致延迟比较高。

优点:性能好,稳定可靠,有活跃的中文社区,特点响应快。
缺点:兼容性较差,但随着影响力的扩大,该问题会有改善。

优点:产品成熟,容易部署和使用,拥有灵活的路由配置。
缺点:性能和吞吐量较差,不易进行二次开发。

优点:产品成熟,支持协议多,支持多种语言的客户端。
缺点:社区不活跃,存在消息丢失的可能。


消息中间件常用协议消息中间件常用协议