在门户中安装 Azure C# 函数后,出现了一个奇怪的问题。
目前,我有一个包含 3 个 C# 函数的消费计划。每个函数都会对服务总线队列触发器使用react,每个函数都有自己的队列。
第一个函数从其队列中读取,然后将 1 条消息发送到下一个函数。如果我在门户上禁用该功能,目前我只能在下一个队列中看到一条消息。
第二个函数从队列中读取消息,然后开始处理它。然后它记录完成,但随后从队列中读取同一消息的第二个实例,并且该函数尝试处理它。
第二个函数读取第一条消息的日志是:
2018-10-24T02:52:58.562 [Info] Function started (Id=fae4c5a0-5df5-47dd-ae8e-76784bc0405e) 2018-10-24T02:52:58.562 [Info] 2018-10-24 02:52:58.562 +00:00 [Information] Push Processor - trackingid:
b0cdd010-2301-4fa2-9da8-731dd795e145
- noticeid:201276
- received for processing on enqueuedatetc:10/24/2018 2:52:58 AM
with sequenceNumber:36
, deliverycount:1
该调用然后以日志结束:
2018-10-24T02:52:59.406 [Info] Function completed (Success, Id=fae4c5a0-5df5-47dd-ae8e-76784bc0405e, Duration=842ms)
但随后再次读取相同的消息:
2018-10-24T02:52:59.214 [Info] Function started (Id=f1d364da-e7be-4e66-b300-4211d7941a2a) 2018-10-24T02:52:59.245 [Info] 2018-10-24 02:52:59.234 +00:00 [Information] Processor - trackingid:
b0cdd010-2301-4fa2-9da8-731dd795e145
- id:201276
- received for processing on enqueuedatetc:10/24/2018 2:52:59 AM
with sequenceNumber:37
, deliverycount:1
我可以看到,即使队列只显示一条消息并且只有一条消息发送到队列,但同一消息的序列号是不同的。
最后的通话记录是:
2018-10-24T02:52:59.417 [Info] Function completed (Success, Id=f1d364da-e7be-4e66-b300-4211d7941a2a, Duration=195ms)
采取的行动:
- 尝试过其他消费应用服务计划
- 尝试过其他标准应用服务计划
- 尝试过另一个新创建的服务总线(基本层)
我们使用服务总线 nuget Microsoft.Azure.WebJobs.ServiceBus 2.2.0
为所有 C# 函数运行 .net 4.7。
向队列添加内容:
var brokeredQueueMessage = new BrokeredMessage(消息);
等待 QueueClient.Value.SendAsync(brokeredQueueMessage);
函数运行方法:
[函数名称(“处理器”)]
公共(public)静态异步任务运行(
[ServiceBusTrigger("processorqueue-dev", AccessRights.Manage, Connection = "ServiceBusConnection")]
BrokeredMessage myQueueItem,
TraceWriter 日志)
{
这可能看起来与第二个函数将消息发送到另一个第三队列以供第三个函数处理有关。现阶段我还没有部署第三个功能。
它确实使用批处理静态函数来异步发送到队列。它确实使用了 BatchSendAsync:
await messageSender.SendBatchAsync(batchList);
如果 secdn 函数没有任何消息要发送,则它似乎没有运行两次。
最佳答案
序列号是当消息排队到服务总线队列时分配给消息的唯一 64 位整数。同一消息不可能有两个不同的序列号。
消息 ID 不唯一,您可以为多条消息设置相同的消息 ID。
我看到的是,重复的消息可能会发送到第二个队列。请检查函数是否多次将同一条消息发送到第二个队列。
第一个和第二个函数的代码示例将有助于提供更多见解。
您还可以检查Incoming messages度量来确定发送到队列的消息总数。
关于c# - Azure函数从服务总线读取队列消息两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52961099/