C# Azure与服务总线的功能:如果消息处理出现问题,如何将消息保留在队列中?

C# Azure与服务总线的功能:如果消息处理出现问题,如何将消息保留在队列中?,c#,azure,azure-functions,azureservicebus,azure-servicebus-queues,C#,Azure,Azure Functions,Azureservicebus,Azure Servicebus Queues,我是新来服务巴士的,没办法弄明白这一点 基本上,我使用的是连接到服务总线队列的Azure函数应用程序。假设从服务总线触发了一个触发器,我从队列接收到一条消息,在处理该消息的过程中,我的代码出现了一些错误。在这种情况下,如何确保将该消息再次放入队列?目前,它只是消失在稀薄的空气中,当我在VS上重新启动我的函数应用程序时,队列中的下一条消息被捕获 理想情况下,只有在完成所有数据处理并点击myMsg.Success()时,我才希望将其从队列中删除 public static async Task Ru

我是新来服务巴士的,没办法弄明白这一点

基本上,我使用的是连接到服务总线队列的Azure函数应用程序。假设从服务总线触发了一个触发器,我从队列接收到一条消息,在处理该消息的过程中,我的代码出现了一些错误。在这种情况下,如何确保将该消息再次放入队列?目前,它只是消失在稀薄的空气中,当我在VS上重新启动我的函数应用程序时,队列中的下一条消息被捕获

理想情况下,只有在完成所有数据处理并点击myMsg.Success()时,我才希望将其从队列中删除

public static async Task RunAsync([ServiceBusTrigger("xx", "yy", AccessRights.Manage)]BrokeredMessage mySbMsg, TraceWriter log)
{
      try{ // do something with mySbMsg }

      catch{ // put that mySbMsg back in the queue so it doesn't disappear. and throw exception}
}

我正在阅读mySbMsg.discard(),但看起来这会将消息放入死信队列,我不知道如何访问它?如果有更好的错误处理方法?

如果希望消息保留在队列中以重试,则函数不应吞并异常,而应抛出异常。这样,函数将不会自动完成消息并重试


请记住,这将导致消息重试,并且最终,如果异常仍然存在,移动到死信队列。

云队列与内存队列有点不同,因为它们需要对客户端在收到队列消息后但在完成消息处理之前崩溃的可能性具有鲁棒性

当接收到队列消息时,该消息将变为“不可见”,因此其他客户端无法拾取该消息。这使客户端有机会处理它,并且客户端必须在完成时将其标记为已完成(当您从函数返回时,Azure函数将自动执行此操作)。这样,如果客户端在处理消息的过程中崩溃(我们在云上,因此对由于功率损失等的随机机器崩溃而健壮),服务器将看到没有完成的消息,假设客户端崩溃,并最终重新发送消息。p>
实际上,这意味着如果您收到队列消息并抛出异常(因此我们没有将消息标记为已完成),它将在几分钟内不可见,但几分钟后它将再次显示,并且另一个客户端可以尝试处理它。换句话说,在Azure函数中,队列消息会在异常后自动重试,但在重试之间,消息会在几分钟内不可见。

根据我的理解,我认为您的问题是,如果在处理消息时出现错误,它需要重试执行,而不是吞咽执行。如果您使用的是Azure Functions V2.0,您可以在
host.json

 "extensions": {
        "serviceBus": {
            "prefetchCount": 100,
            "messageHandlerOptions": {
                "autoComplete": false,
                "maxConcurrentCalls": 1
            }
        }
    }
prefetchCount
-获取或设置消息接收方可以同时请求的消息数

autoComplete
-触发器是否应在处理后自动调用complete,或者功能代码是否将手动调用complete


重试消息n次(默认为10次)后,它将消息传输到DLQ。

应注意,从服务总线队列发出的消息的初始锁定超时在每个队列级别上配置。因此,知道Azure函数是这样工作的,如果默认可见性超时(30s IIRC)对您来说太高,只需将其拨回您的域更可接受的值。队列将支持FIFO模式或竞争消费者,但不支持LIFO模式。@SeanFeldman-您说得对。我刚刚从我的答案中删除了这个术语,它是错误的术语。这在V2上不起作用。函数-这将导致函数主机重新启动。这是ASB的工作方式和触发器使用的内容。。。若消息处理失败,主机将重新启动。你提出问题了吗?