消息总线和消息队列的理解

Posted

技术标签:

【中文标题】消息总线和消息队列的理解【英文标题】:Message bus and Message queue understanding 【发布时间】:2019-12-12 04:12:03 【问题描述】:

我想知道我对消息总线和消息队列工作原理的理解是否正确。

首先,我需要明确命名,服务总线消息总线可以互换使用?它是一种发布者-订阅者类型的系统,其中消息被添加到任意数量的发布者的消息集合中,并且任意数量的订阅者都可以从中读取,到目前为止我是对的吗?

P1 ---                                         /``````S1
       \________ Service Bus Middleware ------+------ S2
       /           MESSAGE-COLLECTION          \______S3
P2 ---

我不明白的是

    订阅者如何知道它感兴趣的消息,我的意思是它显然订阅了它,但是它如何知道它应该订阅哪些消息?,它在哪里看到消息列表,这是如何提供给它的?通过 API 或如何?

    订阅者如何接收消息?

    何时从 MESSAGE-COLLECTION 中删除消息?我可以想象的是,为每条消息保留了一些计数器,该计数器表示订阅者的总数,一旦一个订阅者成功处理了该消息,它就会减少。

消息队列也称为消息代理,是一种推拉式系统。有任意数量的生产者和任意数量的消费者。每个生产者为每个消费者创建一个队列,向其提供消息。

             --- Message Queue 1 ---- C1
           /  
P1 ------ +
           \ 
             --- Message Queue 2 ---- C2


P2 ------ + --- Message Queue 1 ---- C1

既然是这种情况,一旦消费者成功处理了消息,它就会被删除。我的消息队列对其工作原理的理解是否正确?

另一个我不确定具体是做什么的概念是事件中心

【问题讨论】:

"订阅者如何知道它对什么消息感兴趣?" docs.microsoft.com/en-us/azure/service-bus-messaging/…阅读主题和“规则”docs.microsoft.com/en-us/azure/service-bus-messaging/… 【参考方案1】:

我想知道我对消息总线和消息队列工作原理的理解是否正确。

一些cmets/answers。这不会是全面的,因为许多方面都特定于正在使用的队列。

服务总线与消息总线可以互换使用吗?

没错。服务总线是用于面向服务的解决方案中的消息总线基础设施,提供服务之间的后端数据传输机制。

这是一种发布者-订阅者类型的系统,可以将消息添加到任意数量的发布者的消息集合中,并且任意数量的订阅者都可以从中读取

一般有两种型号:

1) 发布/订阅,发布者在不考虑特定目标的情况下将数据发送到总线。然后一个或多个订阅者可以使用该消息(或不使用,见下文)。

2) 请求/响应,发送者将数据发送到总线,但希望接收到特定的数据来处理消息并返回响应。

订阅者如何知道它对什么消息感兴趣...?

大多数服务总线实现都使用路由键的概念。发送到总线的每个数据实体都附带一个密钥,然后订阅者可以通过该密钥进行过滤。

当然,订阅者也可以选择将所有消息发布到特定队列。

订阅者如何接收消息?

这因服务队列产品而异。例如,在 RabbitMQ 中,消息通过 API 传递给订阅者,而在 Kafka 中,客户端必须定期轮询服务器以获取消息。

消息何时从 MESSAGE-COLLECTION 中删除?

有时根本没有。这也因产品和配置而异。有时,一条消息仅传递给一个接收者,并在确认传递后被删除,但有时消息会留在总线上,直到它们根据时间戳过期。许多情况都是可能的。

【讨论】:

以上是关于消息总线和消息队列的理解的主要内容,如果未能解决你的问题,请参考以下文章

从事件总线和消息队列说起

如何在服务总线队列触发功能中将服务总线消息移动到死信

从死信队列重新提交消息 - Azure 服务总线

Azure 服务总线队列消息处理

从服务总线队列接收消息时出现问题

Azure 服务总线中的死信队列中的消息是不是过期?