【问题标题】:Azure function reading queue message twice from service busAzure 函数从服务总线两次读取队列消息
【发布时间】:2018-10-24 04:24:54
【问题描述】:

在门户中安装 azure C# 函数后,我遇到了一个奇怪的问题。

目前,我有一个包含 3 个 C# 函数的消费计划。每个函数都对服务总线队列触发器做出反应,每个函数都有自己的队列。

第一个函数从其队列中读取,然后将 1 条消息发送到下一个函数。如果我在门户上禁用该功能,我目前只能在下一个队列中看到一条消息。

第二个函数从队列中读取消息,然后开始处理它。然后它会记录完成,但随后会从队列中读取同一消息的第二个实例,并且该函数会尝试处理它。

第二个函数读取第一条消息的日志是:

2018-10-24T02:52:58.562 [信息] 功能已启动 (id=fae4c5a0-5df5-47dd-ae8e-76784bc0405e) 2018-10-24T02:52:58.562 [信息] 2018-10-24 02:52:58.562 +00:00 [信息] 推送处理器 - trackingid:b0cdd010-2301-4fa2-9da8-731dd795e145 - noticeid:201276 - 在 enqueuedatec:10/24/2018 2:52:58 AM 上接收处理,序列号为:36,deliverycount:1

然后该调用以 log 结束:

2018-10-24T02:52:59.406 [Info] 功能完成(成功,Id=fae4c5a0-5df5-47dd-ae8e-76784bc0405e,持续时间=842ms)

但随后再次读取相同的消息:

2018-10-24T02:52:59.214 [信息] 功能已启动 (id=f1d364da-e7be-4e66-b300-4211d7941a2a) 2018-10-24T02:52:59.245 [信息] 2018-10-24 02:52:59.234 +00:00 [信息] 处理器 - trackingid:b0cdd010-2301-4fa2-9da8-731dd795e145 - id:201276 - 在 enqueuedatec:10/24/2018 2:52:59 AM 上收到处理,序列号为:37,deliverycount:1

我可以看到,同一条消息的序列号是不同的,即使队列只显示一条消息并且只向队列发送了一条消息。

最后的通话记录是:

2018-10-24T02:52:59.417 [Info] 功能完成(成功,Id=f1d364da-e7be-4e66-b300-4211d7941a2a,持续时间=195ms)

采取的措施:

  1. 已尝试其他消费应用服务方案
  2. 已尝试其他标准应用服务计划
  3. 尝试了另一个新创建的服务总线(基本层)

我们使用服务总线 nuget Microsoft.Azure.WebJobs.ServiceBus 2.2.0 为所有 C# 函数运行 .net 4.7。

向队列中添加内容: var brokeredQueueMessage = new BrokeredMessage(message); await QueueClient.Value.SendAsync(brokeredQueueMessage);

函数运行方法: [FunctionName("Processor")] public static async Task Run( [ServiceBusTrigger("processorqueue-dev", AccessRights.Manage, Connection = "ServiceBusConnection")] BrokeredMessage myQueueItem, TraceWriter log) {

这似乎与第二个函数何时将消息发送到另一个第三个队列以供第三个函数处理有关。在这个阶段,我还没有部署第三个功能。 它确实利用批处理静态函数发送到异步队列。它确实使用了 BatchSendAsync: await messageSender.SendBatchAsync(batchList);

如果 secodn 函数没有任何消息要发送,它似乎没有运行两次。

【问题讨论】:

    标签: c# azure azure-functions azureservicebus azure-servicebus-queues


    【解决方案1】:

    序列号是一个唯一的 64 位整数,当消息被排入服务总线队列时分配给消息。同一条消息不可能有两个不同的序列号。

    Message Id 不是唯一的,您可以为多条消息设置相同的 Message Id。

    我可以看到,重复的消息可能会发送到第二个队列。请检查函数是否多次向第二个队列发送相同的消息。

    第一个和第二个函数的代码示例将有助于提供更多见解。

    您还可以检查Incoming messages 指标以确定发送到队列的消息总数。

    【讨论】:

    • Azure Functions 保证至少一次消息传递。因此,第一个函数可能会两次处理来自其服务总线队列的相同消息,将两条结果消息加载到第二个函数的队列中。您可以查看 this blog post 在 Functions 中的可靠事件处理以获取一些潜在的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多