在Azure Service Bus上调用Abandon会在后面而不是队列的前面重新排队消息

时间:2014-06-15 19:42:01

标签: c# session azure azureservicebus

我使用Azure Service Bus Queue并启用了基于会话的消息传递。要从队列中使用,我注册IMessageSessionAsyncHandler,然后使用OnMessageAsync方法处理消息。

我发现的这个问题是,如果我因任何原因放弃了一条消息,而不是立即再次收到消息,我会收到会话中的下一条消息,并且只有在处理完该消息后才会收到第一条消息再次(假设会话中只有两条消息)。

举个例子,假设我有一个包含2条消息的队列,两者都有相同的SessionId。这两条消息的序列号分别为1和2。正如预期的那样,我开始接收并获得序列1的消息。如果我然后使用message.Abandon放弃此消息(放弃的原因无关紧要),我立即在会话中获取下一条消息(序列号2)。只有在处理(或放弃)第二条消息后,才能再次收到第一条消息。

我看到的这种行为并不是我对放弃消息所期望的,并且与其他使用队列的方式不一致。我在以下场景中测试了同样的例子

  • 不使用IMessageSessionAsyncHandler而只是手动接受消息会话。
  • 不使用会话,而只是在队列中有两条独立的消息。

在这两种情况下,我都看到了预期的行为,因为当我放弃一条消息时,它始终保证是收到的下一条消息,除非超出最大交付数量并且它已经过去了。

我的问题是:我期望使用IMessageSessionAsyncHandler预期的行为,或者这是服务总线库中的错误?如果这不是一个错误,任何人都可以解释为什么这与其他接收方式有所不同吗?

1 个答案:

答案 0 :(得分:1)

在Queueclient上注册会话处理程序时,会在内部打开Prefetch以改善接收器的延迟和吞吐量。不幸的是,对于IMessageSessionAsyncHandler方案,无法覆盖此行为。一种选择是在会话中遇到需要放弃的消息时放弃会话本身,这将确保按顺序传递消息。