Azure 服务总线订阅是否像队列一样?

Does an azure service bus subscription act like a queue?

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

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

所以假设你有一个队列,你可以向它发送多条消息,并且有多个 clients/readers 连接到队列。在这种情况下,每条消息只会被一个 client/reader.

接收

现在假设您创建了一个主题,并向该主题发送消息。并且您有几个 clients/readers 他们每个人都订阅了该主题;在这种情况下,每个 client/reader 将收到发送到该主题的所有消息。

但这就是我想知道的:

是否可以创建一个主题,一个订阅;然后将多个 clients/readers 连接到同一个订阅? 如果是这样;那么我可以假设每条消息只会被一个 client/reader 接收吗?

(或者,这是不可能的,我们是否需要创建一个队列;然后link那个队列到订阅,并在队列上创建多个读者。)

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

正如您所说,您对文档的理解完全正确。对于您的问题,您应该创建一个具有多个订阅的主题,然后每个客户端都可以通过该主题接收分配给他们的消息。

实际上,服务总线主题和订阅支持 publish/subscribe 消息通信模型。使用主题和订阅时,分布式应用程序的组件不会直接相互通信;相反,他们通过主题交换消息,主题充当两者之间的中介。

如果您不想使用上述型号,您可以选择eventhub,这将满足您的要求。您可以根据需要创建分区和应用程序。

Is it possible to create a topic, with one subscription; and then connect multiple clients/readers to that same subscription?

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

And if so; can I then assume that each message will be received by only one client/reader?

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

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

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

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


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