Azure函数从服务总线两次读取队列消息

时间:2018-10-24 04:24:55

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

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

当前,我有一个使用3个C#函数的使用计划。每个功能都对服务总线队列触发器做出反应,每个都有自己的队列。

第一个功能从其队列中读取,然后向下一个功能发送1条消息。如果我在门户网站上禁用了该功能,则当前只能在下一队列中看到一条消息。

enter image description here

第二个功能从队列中读取消息,然后开始处理它。然后记录完成,但是从队列中读取同一消息的第二个实例,然后函数尝试对其进行处理。

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

  

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   -已收到,用于在enqueuedatetc:10/24/2018 2:52:58 AM上以sequenceNumber:36,deliverycount:1

处理

该呼叫以日志结尾:

  

2018-10-24T02:52:59.406 [信息]功能已完成(成功,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   -已收到,用于在enqueuedatetc:10/24/2018 2:52:59 AM上以sequenceNumber:37,deliverycount:1

处理

我看到的是,即使队列仅显示一条消息并且仅向队列发送了一条消息,同一条消息的序列号也是diff。

最后的通话记录是:

  

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

已采取的操作:

  1. 尝试了另一个消费应用服务计划
  2. 尝试了另一种标准的应用程序服务计划
  3. 尝试了另一种新创建的服务总线(基本层)

对于所有C#函数,我们都使用服务总线nuget Microsoft.Azure.WebJobs.ServiceBus 2.2.0运行.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函数没有任何要发送的消息,则它似乎没有运行两次。

1 个答案:

答案 0 :(得分:2)

序列号是每当一条消息进入服务总线队列时分配给该消息的唯一64位整数。同一封邮件不可能有两个不同的序列号。

消息ID不是唯一的,您可以为多个消息设置相同的消息ID。

我看到的是,重复的消息可能会发送到第二个队列。请检查是否多次从同一功能将相同消息发送到第二个队列。

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

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