服务总线队列的噩梦。消息消失

时间:2017-06-06 17:29:30

标签: azure azureservicebus azure-servicebus-queues cancellation-token

我们正在两个不同的实例上运行云服务。此云服务在服务总线队列上旋转接收器。该接收器配置为: 1.窥视和锁定模式 2.自动完成=真 3. RenewLockTimeout = 10分钟 4. MaxConcurrentMessages = 1 5. PrefetchCount = default(应为0)

据我所知,这意味着同时处理最多两条消息(每个实例一条消息),并且一旦消息处理程序完成,消息就会自动从队列中删除。

现在,几天前Azure决定更新我们的实例。我从日志中看到,在18.18,第一个实例被要求停止。在18.24,实例被停止,并在18.27重新上线。在18.28,要求第二个实例停止,并在18.35重新上线。

七条信息已在18.23排队。其中一个产生了DB上的预期记录(即处理程序已成功执行)。另外6,没有。死信队列已启用,但为空。

理论上,我的代码应该在角色进入OnStop方法后立即停止接收消息。取消令牌被取消,消息处理程序被“暂停”,导致延迟10分钟(因此,据我所知,消息不应该完成,然后应该再次处理)。所以我不能说第一台消息是由第一台或第二台机器处理的。但它已被处理。而且我确信其他6人都在排队。

如果消息处理程序中存在异常,我将其发送到Application Insights并重新抛出(让处理程序失败并再次处理消息)。但我没有证据证明这一点。

我想我已经检查了所有内容,但我无法分辨为什么这些消息会消失。根据您的经验,应该是什么?

关闭后Azure等待5分钟是否正常?或者这是一个我不尊重取消令牌的信号?

由于

2 个答案:

答案 0 :(得分:0)

众所周知,接收方可以通过两种不同的方式从Service Bus队列中读取消息:ReceiveAndDelete and Peek-lock。 ReceiveAndDelete模式,如果接收器在完成处理消息之前崩溃,则消息将丢失。 Peek-lock模式,如果接收器在完成处理消息之前崩溃并且没有完成消息,则消息不会丢失/消失。

正如其他人所说,没有看到你的代码,很难找到问题。如果可能,请修改您的代码以将OnMessageOptions.AutoComplete property设置为false,并在接收方完成处理消息并在您的数据库上创建记录后显式调用Complete(),然后检查它是否可以解决问题。

答案 1 :(得分:0)

我刚刚在从服务总线主题订阅处理函数应用程序时遇到了类似的症状,其中消息似乎正在消失。

我在函数应用启动时通过 ServiceBusClient 实例化 AzureClientServiceCollectionExtensions.AddAzureClients。在我在 ReceiveAndDelete 模式下创建 ServiceBusReceiver 并调用 ReceiveMessagesAsync 方法的类中。

问题似乎出在 ServiceBusReceiver 周围,据说它在后台使消息出列(即使在我的函数应用程序停止之后!)。解决这个问题的方法是在我处理完接收器后处理掉它。