什么是消息代理?
什么是消息代理?
消息代理是一种软件组件,可使服务和应用程序通过消息进行通信。现代应用程序由多个独立的软件组件构成,这些组件必须在分布式架构中相互协调,以完成共同的任务。消息代理提供预定义的消息结构和机制,使多个组件无需同时在线即可发送和接收消息。软件开发人员使用消息代理来提供可靠、持久和异步的消息传输。
消息代理有哪些优势?
消息代理充当中间接口,用于可靠地存储、传输和传送消息。它使开发人员能够克服消息传递方面的挑战,并以多种方式为软件团队带来收益。
持久消息传递
消息代理确保将所有消息安全地传送给其收件人。当应用程序服务向其他软件组件发送消息时,某些传送可能会因网络问题或收件人脱机而失败。消息代理将未传送的消息存储在持久存储中,并通过死信队列机制对其进行处理。这样可以确保当消息系统或收件人从错误中恢复后,收件人最终能收到发给他们的消息。
提升系统性能
如果应用程序因过多的消息处理而过载,其性能将会下降。以一款视频处理应用程序为例,它接收来自数百万用户的“视频录制已开始”、“视频上传已开始”和“视频上传完成”等消息。如果应用程序对每条事件消息都进行存储、格式化、排队、验证和等待,则用于其核心任务——视频处理的处理能力将所剩无几。消息代理可促进应用程序与相互依赖的服务之间的通信,从而提升系统性能。
异步消息收发
异步消息收发使应用程序和服务无需始终保持网络连接,也能交换消息。这为开发人员提供了更大的灵活性,例如可以将服务置于休眠模式,并按特定时间间隔唤醒它们以发送或接收消息。
消息代理的用例有哪些?
消息代理使软件开发人员能够扩展其构建的服务,而无需受复杂消息路由的限制。例如,您可以使用 Java 消息服务将消息收发与应用程序的核心功能解耦。下文将介绍在构建现代应用程序时使用消息代理的更多方式。
管理长时间运行的任务
有些任务需要较长时间才能完成,应用程序无法承受可能影响用户体验的延迟。例如,假设有一款音频处理软件,需要请求外部服务对录音进行转录。如果没有消息代理,应用程序必须等待请求处理完成后,才能继续处理后续任务。因此,在应用程序收到转录服务的响应之前,用户无法执行任何其他操作。消息代理允许应用程序将耗时任务委派给专用消息队列。应用程序无需无限期等待结果,可以继续处理其他用户请求。转录完成后,应用程序从消息代理处检索结果,并相应地通知用户。
使用微服务重组单体应用程序
单体应用程序是基于单一代码库开发的软件。随着开发人员引入更多功能,系统复杂性逐渐成为一个问题,这促使人们转向由微服务驱动的分布式系统。
微服务是完成特定功能的小型软件组件,但各组件可以协同工作以实现更大的目标。例如,送餐应用程序会针对支付、车队跟踪和餐厅通信分别使用不同的微服务。
开发人员使用消息代理,以确保微服务在复杂的路由场景中高效地交换数据。消息代理是一个中心节点,每个微服务均可通过发布或订阅的方式获取最新数据。
开发事务系统
事务系统按特定流程处理任务,以避免重复操作。负责完成事务的每项服务会检索发送给自身的消息,处理底层数据,并将结果发布至消息代理。消息代理随后在处理完成后删除已消费的消息。
为互联设备建立通信
消息代理支持机器、机器人、物联网 (IoT) 和其他联网设备之间的点对点消息传递和异步处理。这些设备必须交换数据才能可靠地运行、更新数据库、启用分析并执行其他功能。通过连接到消息代理,设备可以使用受支持的标准消息协议(例如 RabbitMQ)轻松地将消息发送到不同的软件组件。
启用移动通知
移动应用程序必须能够接收和显示推送通知,即使未在设备上主动运行时也不例外。借助消息代理,移动应用程序可以从其订阅的主题中拉取消息,而无需频繁与后端服务进行交互。
消息代理是如何工作的?
消息代理允许相互依赖的服务通过集中式分发系统发送和接收信息。它通过执行特定的规则、流程和数据结构来简化信息流。
关键架构组件
下面介绍消息代理所涉及的基本架构组件,以帮助理解消息代理的工作原理。
生产者
生产者是向一个或多个接收方发送消息的应用程序。例如,将拍摄的图像存储到云端的相机应用程序就是一个生产者。
消费者
消费者是从消息代理检索或接收消息的应用程序。根据代理类型,一个或多个消费者可能会检索同一条由生产者发送的消息。
消息队列
消息队列是一种管道,用于存储消息,直到消费者读取为止。根据需求,消息代理可能会在将存储的消息发送给消费者之前对其进行排序或格式化。如果消费者发生故障,消息仍会保留在队列中。
交换器
交换器创建主题,以将相似类型的消息归为一组。这样,消费者可以订阅特定主题,而无需检索和筛选队列中的所有消息。

点对点消息传递
在点对点架构中,一个消息生产者直接与一个消费者通信。生产者向消息队列发送消息,代理存储该消息,直到消费者读取为止。然后,代理将消息从队列中删除。即使有多个消费者连接到消息队列,也只有一个消费者能收到该消息。点对点消息传递适用于金融交易处理,可避免重复处理。例如,您可以为验证、资金转账和通知分别分配不同的服务。
发布/订阅消息传递
发布/订阅(pub-sub)消息传递架构由松耦合的生产者和消费者组成。在此架构中,生产者称为发布者,消费者称为订阅者。两者共同构成一对多关系。每个发布者将消息存储在主题中,多个订阅者均可检索这些消息。主题是代理用于对不同消息进行分类的类别。例如,在为新闻应用程序开发发布订阅消息时,您可以发布有关政治、经济和体育话题的消息。消息代理会将属于特定主题的消息路由给订阅的收件人。
消息代理与其他消息组件有何区别?
应用程序在交换数据时会使用不同的消息收发组件。以下是消息代理与其他方案的对比。
消息代理与消息队列
消息队列是一种数据结构,用于按特定顺序存储生产者发送的消息。消息按先入先出(FIFO)的顺序进行查询,并保留在存储中,直到目标收件人读取为止。有时,消息代理会利用消息队列作为临时且具备容错能力的存储机制,从而为软件应用程序提供可靠的消息收发系统。
例如,Amazon Simple Queue Service (Amazon SQS) 是一个完全托管的消息队列平台,适用于微服务、分布式系统和无服务器应用程序。它支持在软件组件之间以任意规模发送、存储和接收消息,既不会丢失消息,也不要求其他服务必须处于可用状态。
消息代理与事件流平台
事件流平台是托管服务,允许软件应用程序处理持续不断的应用程序事件流。事件按主题进行分类,消费者可订阅相应主题。在分布式事件流平台中共享数据时,其分发原理与消息代理类似;但是,流平台侧重于高速存储和可恢复性。它们通过分区复制消息,并将消息存储在不同的物理服务器上。相比之下,消息代理更关注将消息传递给预期的接收者。因此,事件流式传输平台可能不具备消息代理所拥有的消息追踪和重发功能。
消息代理通常会在所有接收方读取存储的消息后将其删除,但流平台可能会无限期地保留这些消息。当事件流平台收到新消息时,会将其追加到持续增长的消息队列中。
消费者在订阅消息代理的主题时,可以筛选要接收的消息类型。但是,所有订阅者接收到的消息都是相同的,必须在应用程序内部通过编程方式进行筛选。
消息代理与消息总线
消息总线是一种消息收发中间件,用于连接计算机系统中的不同硬件、服务和软件。消息总线也称为企业服务总线(ESB),它使用标准协议对其他组件发送的消息进行重组。ESB 通常用于服务导向型架构 (SOA)。SOA 是一种软件开发方法,它使用不同的服务来构建应用程序。与消息总线相比,消息代理是更为灵活的消息分发系统。开发人员更青睐消息代理,因为它们具有可扩展性、灵活性且维护成本较低。
亚马逊云科技如何满足您的消息代理需求?
Amazon MQ 是一项完全托管的代理服务,可让您轻松设置、优化和管理主流消息代理。只需简单几步,您即可将使用不同语言构建的生产者和消费者连接到 Amazon MQ,并交换高吞吐量信息。例如,您可以:
-
借助代理网络,无需繁琐的配置,即可将本地应用程序迁移到亚马逊云科技。
-
通过跨亚马逊云科技可用区可靠地交换消息,确保终端节点具备容错性和高可恢复性。
-
与 Amazon CloudWatch 和 Amazon CloudTrail 等其他服务集成,以监控应用程序所连接的所有代理、队列和主题。
立即创建免费账户,开始在亚马逊云科技上使用消息代理。
Browse all cloud computing concepts
Browse all cloud computing concepts content here:
Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages