尝试理解 Azure Service Bus 会话

9

我正在尝试了解Azure服务总线会话ID,以创建FIFO队列。

我的想法非常直接,但我不知道是否是FIFO的正确方式。

以下是我创建FIFO队列的步骤:

创建:

第一步:检查队列中的消息及其会话ID,并公开ID层次结构。

接下来:使用层次结构中最新的Session-ID创建新消息,并将该值迭代1(+1)。

接下来:发送到服务总线队列。

阅读:

第一步:检查队列中的消息及其会话ID,并公开ID层次结构。

接下来:阅读并删除层次结构中最早的Session-ID。

接下来:处理...

请注意,我没有包括错误处理等内容,例如阅读和删除部分,因为我已经想出了解决方案。

问题是这种思考方式是否正确,另外,我如何在C#中实现这一点?我无法找到一个简单明了的解释这个概念的资料。

2个回答

13

具体来说:

假设您有9个总队列消息,这些消息分为三个会话,session id为1、2和3。每个包含3条消息的组将按顺序处理(先进先出)。

然而,如果有多个队列监听器,仍然可以在会话之间或每组消息之间发生并行处理。

队列的每个监听器/处理器都会锁定所有共享相同会话ID的消息,然后逐个处理每个消息,直到会话完成(通常是当没有剩余该会话ID的消息时,除非您关闭了 AutoComplete 并决定在必要时手动关闭会话)。

希望这样讲清楚了。


1
在三个会话中,首先检索并锁定哪个会话?(如果没有超过一个侦听器) - Deepak
1
它将是FIFO队列中到达的第一条消息所引用的会话。 - boylec1986

7
我正在尝试理解Azure服务总线会话ID以创建我的队列中的FIFO。假设您已经阅读了消息会话上的文档,并且没有跳过Microsoft.Azure.ServiceBusWindowsAzure.ServiceBus的链接示例,那么您会注意到后一个示例有关于会话操作的广泛解释。您不需要“创建”FIFO队列,只需使用会话即可实现所需功能。会话有其用例之一是您的情况,在其中具有一个无限期的会话和一个单个会话ID来保持消息的顺序。注意:请注意限制(没有并行处理将影响吞吐量)。

如何在C#中实现这一点,我无法找到一个简单明了地解释这个概念的东西。

旧版客户端示例提供了关于您实现相关问题的答案,并且有非常扎实的分解和解释(WindowsAzure.ServiceBus)。


重处理时,失败的消息是否会记住其会话ID? - Kelvin
是的。每个消息都分配了SessionId。 - Sean Feldman
所以,如果队列中有3条消息,使用会话是否确保如果消息1在处理过程中出现异常,那么消息2和3直到消息1成功处理之前都不会被处理?在我的场景中,我需要确保消息按照队列顺序进行处理,并且新加入的消息会被暂停处理,直到之前的消息成功处理完成。 - undefined
不。https://github.com/Azure/azure-service-bus/issues/675 - undefined
真遗憾,谢谢@SeanFeldman。所以我猜我需要自定义逻辑来手动跟踪最新已处理的序列号? - undefined
这有点麻烦。ASB会继续发送消息给你。你无法暂停这些消息。所以如果第一条消息发送失败,你会继续收到第2条和第3条消息。 - undefined

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