首页 > 解决方案 > azure 服务总线订阅是否像队列一样?

问题描述

这可能是一个愚蠢的问题,但我无法通过阅读文档找到明确的答案。

这是我从文档中了解到的:

所以假设你有一个队列,你可以向它发送多条消息,并且有多个客户端/阅读器连接到队列。在这种情况下,每条消息将仅由一个客户端/阅读器接收。

现在假设您已经创建了一个主题,并向该主题发送消息。你有几个客户/读者,他们每个人都订阅了这个主题;在这种情况下,每个客户端/阅读器都将收到发送到该主题的所有消息。

但这是我想知道的:

是否可以创建一个主题,一个订阅;然后将多个客户端/读者连接到同一个订阅?如果是这样; 然后我可以假设每条消息只会被一个客户/读者接收吗?

(或者,这不可能吗,我们是否需要创建一个队列;然后将该队列链接到订阅,并在队列上创建多个读取器。)

附言; 我知道只有一个订阅的主题是没有意义的。我真正想到的是一个具有多个订阅的主题,每个订阅可能有零个、一个或多个客户端读取它。

标签: azureazureservicebusservicebusazure-servicebus-queuesazure-servicebus-topics

解决方案


是否可以创建一个主题,一个订阅;然后将多个客户端/读者连接到同一个订阅?

是的,当然可以这样做。多个客户/读者可以从一个订阅中读取。

如果是这样; 然后我可以假设每条消息只会被一个客户/读者接收吗?

是的,每条消息只会被一个客户/读者接收。Peek/Lock客户端可以在任一模式或模式下读取消息Receive/Delete以保证排他性。

当在Peek/Lock模式下获取消息时,接收消息的客户端会在一定时间内获得对消息的排他锁,并且在此期间,其他客户端将看不到该消息。如果客户端处理消息并将其删除,那么其他客户端将永远看不到它。如果客户端在此期间无法处理该消息,则该消息将在此之后对其他客户端可见,并且其他客户端也可以读取该消息。

Receive/Delete模式下获取消息时,一旦客户端收到消息,它将从服务器中删除,因此其他客户端无法获取该消息。

客户端也可以在Peek模式下获取消息,但在这种情况下,所有其他客户端也可以使用相同的消息。


在您的场景中,您实际上是在将订阅用作队列,您最好只使用队列而不是使用主题和订阅。


推荐阅读