什么是消息队列?

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 276 小节,累计 43w+ 字,讲解图:1917 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1500+ 小伙伴加入,欢迎点击围观

消息传递协议的实现是现代应用程序的基本通信组件。不同的应用程序组件需要在传输消息的同时确保可靠和高效的通信。确保可靠消息交换的一个很好的例子是实现队列。一旦将消息分配给队列,它的目的地就已经建立。此消息将始终得到传递。此外,如果目的地正忙或未连接,队列将保留该消息,直到目的地返回。您需要一个消息队列系统来实现这些高级队列操作,如消息持久性、消息优先级、计划消息、生存时间等。让我们深入研究并详细了解消息队列。

什么是消息队列?

消息包含正在发送或接收的实际数据的有效负载。这些消息由生产者发送并由消费者接收。另一方面,队列以先进先出 (FIFO) 顺序存储和管理这些消息流,直到消费者检索它们。它保存等待处理的消息。然后,这些消息将按照接收到的顺序入队和出队,以确保发送方和接收方之间的异步通信。

在这种情况下,消息队列允许应用程序通过队列发送和接收消息。这些消息存储在队列中,直到接收应用程序处理它们。它通过确保服务可以将消息发送到队列并继续处理来允许异步通信。相反,另一个服务可以接收消息并及时处理它。

如何使用消息队列的一个完美假设示例是使用消息队列处理订单的电子商务应用程序。在这种情况下,当客户下订单时,应用程序会向队列发送一条包含订单详细信息的消息。此消息负载将包括详细信息,例如客户的送货地址、订购的产品以及订单的总费用。

同一个应用程序将有另一个服务(履行服务)从队列接收消息并处理订单。在使用消息队列时,应用程序仍然可以处理其他消费者的传入订单,而履行服务会在收到订单时处理这些订单。系统保持可扩展性,因为订单服务不需要等待履行服务完成订单才能处理传入的订单。

消息队列架构

消息队列使用简单的架构:

  • 生产者:它由生成消息并将消息发送到消息队列的客户端组件组成。
  • 消费者:它包含处理来自队列的消息的服务器目标服务。
  • 队列:存储消息的体系结构的核心组件。放置在队列中的消息将被存储,直到消费者检索它们。


当消费者处理任务时,它会从队列中移除。但是,此过程可能因所使用的消息队列类型而异。

消息队列的类型

消息队列风格各不相同。主要的消息队列类型有:

  • 点对点队列

点对点队列将消息从单个生产者发送到单个消费者。它构成了消息队列方法的最基本形式。此方法通常用于服务之间的简单和一对一通信。

点对点队列的一个很好的例子是网络应用程序和后端服务器之间的通信。在这种情况下,应用程序会向队列发送一条包含用户请求的消息。然后服务器处理请求并将响应发送回应用程序。消息仅由一个消费者产生,由一个消费者接收,然后从队列中移除。

  • 发布-订阅模式

这种方法将消息从生产者(发布者)发送到多个消费者(订阅者)。消费者可以订阅特定的消息类别并接收与相应订阅匹配的消息。每当您想将消息发送给多个收件人时,Pub/Sub 模式都是必不可少的。
适合 Pub/Sub 模式的一个很好的例子是新闻系统。例如,金融新闻系统可用于根据特定订阅(如股票价格和市场趋势)向多个订阅者发送消息。所有订阅相关类别的订阅者都将收到新闻更新。

  • 扇出队列

扇出队列与发布/订阅模式密切相关。消息从单个生产者发送到多个消费者。但是,它使用扇出模式。所有连接的消费者都会同时收到生产者发送的消息。

扇出通常用于创建实时事件驱动的应用程序。以社交媒体平台为例。您添加到时间线的任何帖子都会实时发送给您的所有关注者。 Fanouts 的显着优势是能够实现实时通信。聊天应用程序使用实时事件驱动架构来发送群聊通信。所有组成员都会收到一个成员发送的消息。

  • 死信队列

当生产者将消息发送到队列时,消费者可能无法接收已发送的消息。在这种情况下,消息将存储在队列中,直到它的接收者可用为止。死信队列用于存储在给定时间无法传递给预期收件人的消息。
以电子邮件应用程序为例,具体为电子邮件递送服务。在这种情况下,如果您发送的电子邮件未能送达目标收件人,它会存储在死信队列中以供进一步检查或重新路由至其他收件人。

  • 优先队列

使用先进先出 (FIFO) 方法处理存储在队列中的消息。这意味着首先接收到的消息将被首先处理,其他消息将按照相同的顺序进行处理。但是,您可以使用队列根据优先级处理消息。

优先级队列用于存储和管理具有不同优先级的消息。消息是根据优先级处理的。优先级高的消息首先处理,优先级低的消息最后处理。

优先级队列允许您处理时间敏感和重要的消息。以销售VVIP、VIP和常规产品的应用程序为例。在这种情况下,可以使用优先队列根据您设置的级别处理订单。

消息队列的好处

消息队列为现代应用程序开发提供了优势。基于这篇文章,让我们看看在使用消息队列时可以利用的一些优势。

  • 消息队列最擅长允许应用程序解耦。单个应用程序可以划分为不同的微服务组件。每个组件独立运行。这些微服务可以使用消息队列进行通信,而无需在单体架构中紧密耦合。生产者和消费者不一定需要同时连接。每个服务都是独立的。
  • 分离的微服务提供了应用程序的弹性和可靠性。如果接收方在收到消息时无法处理消息,则可以将消息存储在队列中并稍后处理。
  • 它创建容错模型。当目标节点重新联机时,将重新传递消息。当您的应用程序遇到高流量和停机维护时,这是必要的。
  • 消息队列有能力接收大量消息,而消费者仍在相应地处理它们。这创造了可扩展性优势。随着系统的增长,您可以轻松扩展以处理更多消息。生产者仅负责创建消息,消费者接收消息并将其传递到预期目的地。该应用程序无需对体系结构进行重大更改即可处理不断增加的负载。
  • 解耦您的应用程序并允许消息队列异步处理消息可以提高整体性能。消费者和生产者无需等待对方即可继续执行任务。每个组件将消息推送到队列中,并在准备就绪时检索它们。这允许生产者在传递消息后释放带宽。消费者总是在后台处理新传入的消息而不会阻塞应用程序,从而提高性能。
  • 消息队列提供了一种更直接的监视方法。您可以获得事务洞察,例如发送、接收、失败、拒绝和重试的消息。这提供了监控统计信息,使您能够了解性能以及数据在系统中的流动方式。

消息队列用例

基于以上好处可以应用消息队列,这篇文章讨论了队列类型。使用消息队列的日常用例示例包括:

  • 用于管理订单、库存更新、运输和交付等服务流程的电子商务应用程序。
  • 社交媒体应用程序使用队列来管理通知。
  • 聊天应用程序需要队列来创建实时消息传递平台。
  • 游戏应用程序可以使用队列来处理配对。
  • 物联网 (IoT) 使用不同的服务来管理传感器数据和设备更新。这使得实现消息队列来管理来自不同源及其各自目的地的数据流变得毫不费力。

结论

消息队列是创建可伸缩、容错应用程序的强大工具。这与它们分离操作和增强整体应用程序可靠性的能力密切相关。您可以使用消息队列来获得灵活性并更轻松地扩展您的应用程序。这使队列成为应用程序架构的重要补充。本文指导您了解什么是消息队列以及为什么需要它们。