【发布时间】: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)
采取的措施:
- 已尝试其他消费应用服务方案
- 已尝试其他标准应用服务计划
- 尝试了另一个新创建的服务总线(基本层)
我们使用服务总线 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