gpt4 book ai didi

c# - 在 Azure 服务总线上调用 Abandon 会将消息重新排队到队列的后面而不是前面

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:57 25 4
gpt4 key购买 nike

我正在使用启用了基于 session 的消息传递的 Azure 服务总线队列。为了从队列中使用,我注册了一个 IMessageSessionAsyncHandler,然后在 OnMessageAsync 方法中处理消息。

我看到的这个问题是,如果我出于某种原因放弃一条消息,而不是立即再次收到消息,我会收到 session 中的下一条消息,并且只有在处理该消息后,我才会再次收到第一条消息(假设 session 中只有两条消息)。

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

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

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

在这两种情况下,我都看到了预期的行为,因为当我放弃一条消息时,它总是保证是收到的下一条消息,除非超过最大传递计数并且它是死信的。

我的问题是这样的:我在使用 IMessageSessionAsyncHandler 时看到的行为是预期的,还是服务总线库中的错误?如果这不是一个错误,谁能给我解释一下为什么它的行为与其他接收方式不同?

最佳答案

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

关于c# - 在 Azure 服务总线上调用 Abandon 会将消息重新排队到队列的后面而不是前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com