消息队列和消息代理之间有什么区别?

46
从我的理解来看,消息队列有助于进程间通信,但基本上只允许两个应用程序之间的通信?我之所以问这个问题,是因为例如 MSMQ(如果我理解正确的话),它只会将消息存储在队列中,直到第一个消费者处理完毕,然后自动从队列中删除。这样理解对吗?
现在,消息代理是消息队列的一种扩展,它提供了一种发布-订阅关系的机制,类似于观察者模式。我的理解正确吗?如果是这样,两者之间还有其他区别吗?此外,为什么要使用消息队列而不是消息代理,因为您很可能会使用由多个服务组成的分布式系统。

请在您的请求中添加更多细节。这些词没有与任何具体的软件产品相关性,因此它们是无意义的。从技术上讲,"queue"或"bus"是同一系统的一部分,其中"队列"或"总线"是存储和消费数据片段的地方。 这可以是某种数据库中的地址。经纪人是这种系统中的代理,处理各种方面,如数据访问、数据格式配置、路由规则、触发器等。大多数情况下,经纪人是一个消息服务器。消息队列也可以是IPC的编程接口的一部分。 - Konstantin Ivanov
5个回答

52

消息队列是一种数据结构或容器,用于保存待处理的消息。消息代理是一个独立的组件,用于管理这些队列。


23
消息代理(也称为服务总线)是一种中间件,负责持久化和路由消息,同时允许您将系统解耦为较小的部分。 消息队列是消息代理的一部分,只是一种持久化机制。

3
除了以上的答案,
来源:https://www.ibm.com/cloud/learn/message-brokers 消息代理是一种软件,它使应用程序、系统和服务能够相互通信并交换信息。消息代理通过在正式的消息传递协议之间转换消息来实现这一点。这使得相互依赖的服务能够直接“交谈”,即使它们是用不同的语言编写或在不同的平台上实现。
消息代理是消息中间件或面向消息的中间件(MOM)解决方案中的软件模块。这种中间件为开发人员提供了一种标准化的方式来处理应用程序组件之间的数据流,以便他们可以专注于其核心逻辑。它可以作为分布式通信层,允许跨多个平台的应用程序进行内部通信。
消息代理可以验证、存储、路由和将消息传递到适当的目标。它们作为其他应用程序之间的中介,允许发送者发出消息而不知道接收者在哪里、是否处于活动状态或有多少个接收者。这有助于系统内进程和服务的解耦。
为了提供可靠的消息存储和保证传递,消息代理通常依赖于一个称为消息队列的子结构或组件,该组件会存储和排序消息,直到消费应用程序可以处理它们。在消息队列中,消息按照发送顺序精确地存储,并保留在队列中直到确认接收。

0

消息队列通过使用队列数据结构发送、接收和存储消息,促进应用程序之间的通信。尽管我们使用消息队列进行数据传输,但它们无法读取它们所携带的信息。

消息代理只是一种扩展消息队列使用的机制。与消息队列不同,消息代理可以读取它们所携带的信息内容。此外,消息代理可以处理来自各种来源的信息,例如从文件或HTTP请求中读取的信息。

简而言之,消息代理负责: - 数据传输协议之间的转换 - 服务之间消息格式的转换 - 服务之间通信的路由 - 来自各种来源的事件分发

事实证明,消息代理使用消息队列在所有感兴趣的方之间传输信息。简单地说,消息队列是一种结构,它存储生成的数据直到被消费,而消息代理是管理消息队列的软件组件。


0
消息队列(MQ),消息总线(MB)和消息代理是用于应用程序之间通信的中间件框架。这些组件在某种程度上与技术无关,它们不关心应用程序是如何实现的(Java、Python、Ruby等)。不同的应用程序使用不同的语言进行交流,并且本质上不能与其他应用程序进行通信,除非它们自己执行繁琐的翻译任务。中间件组件存在的目的是消除这种摩擦,使应用程序能够彼此无缝地交流。
消息队列(MQ)与消息总线(MB)的区别与消息代理分开来看可以更好地理解。原因在于MQ和MB之间只有轻微的差异。

消息队列和消息总线 它们本质上是应用程序之间的消息分发器。它们接收来自发布者的简单格式(文本、XML、JSON)的消息,并允许有效的订阅者消费这些消息。由于这些组件内部具有持久性构建,因此可以在消息丢失的情况下保证传递。消息队列与消息总线的区别在于,在存储消息时它确保先进先出(FIFO)顺序。传递顺序在这里得到维护。消息总线只是不关心消息的顺序。例如,如果你在公交车上旅行,第一个上车的人不一定要先下车。他实际上可能在前往最后一个目的地。类似地,在消息总线中,您可以编写逻辑以按不同优先级和顺序发送消息。

消息代理 我们可以说消息代理是更大的兄弟。虽然消息队列和消息总线只是存储消息并将其传递给有效的客户端,但消息代理还额外执行系统之间的转换工作,并有时封装路由和业务逻辑。使用消息代理,您对应用程序之间的通信拥有更多控制权。它还支持除简单文本/XML/JSON之外的更多输入/输出格式。


根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接