C# Azure函数从服务总线读取队列消息两次
在门户中安装azure C#功能后,我遇到了一个奇怪的问题 目前,我有一个包含3个C#函数的消费计划。每个函数对服务总线队列触发器作出反应,每个函数都有自己的队列 第一个函数从其队列中读取,然后向下一个函数发送一条消息。如果禁用门户上的功能,我当前只能在下一个队列中看到一条消息 第二个函数从队列中读取消息,然后开始处理它。然后它会记录完成的消息,但随后会从队列中读取同一消息的第二个实例,该函数会尝试处理该消息 读取第一条消息的第二个函数的日志为: 2018-10-24T02:52:58.562[信息]功能启动 (Id=fae4c5a0-5df5-47dd-ae8e-76784BC045E)2018-10-24T02:52:58.562 [信息]2018-10-24 02:52:58.562+00:00[信息]推送处理器- trackingid:C# Azure函数从服务总线读取队列消息两次,c#,azure,azure-functions,azureservicebus,azure-servicebus-queues,C#,Azure,Azure Functions,Azureservicebus,Azure Servicebus Queues,在门户中安装azure C#功能后,我遇到了一个奇怪的问题 目前,我有一个包含3个C#函数的消费计划。每个函数对服务总线队列触发器作出反应,每个函数都有自己的队列 第一个函数从其队列中读取,然后向下一个函数发送一条消息。如果禁用门户上的功能,我当前只能在下一个队列中看到一条消息 第二个函数从队列中读取消息,然后开始处理它。然后它会记录完成的消息,但随后会从队列中读取同一消息的第二个实例,该函数会尝试处理该消息 读取第一条消息的第二个函数的日志为: 2018-10-24T02:52:58.562
b0cdd010-2301-4fa2-9da8-731dd795e145
-通知ID:201276
-已在enqueuedatetc:10/24/2018 2:52:58 AM接收以进行处理,序列号为:36
,交货计数为1
然后,该调用以log结束:
2018-10-24T02:52:59.406[信息]功能完成(成功,Id=fae4c5a0-5df5-47dd-ae8e-76784BC045E,持续时间=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[信息]处理器-
跟踪id:b0cdd010-2301-4fa2-9da8-731dd795e145
-id:201276
-已在enqueuedatetc:10/24/2018 2:52:59 AM接收以进行处理,序列号为:37
,交付计数为1
我可以看到,对于同一条消息,序列号是diff,即使队列只显示一条消息,并且只有一条消息被发送到队列。
此操作的最后一个调用日志是:
2018-10-24T02:52:59.417[信息]功能完成(成功,Id=f1d364da-e7be-4e66-b300-4211d7941a2a,持续时间=195ms)
采取的行动:
Microsoft.Azure.WebJobs.ServiceBus 2.2.0
运行.net 4.7以实现所有C#函数
向队列中添加内容:
var brokeredQueueMessage=新的BrokeredMessage(消息);
等待QueueClient.Value.SendAsync(brokeredQueueMessage)代码>
函数运行方法:
[函数名(“处理器”)]
公共静态异步任务运行(
[ServiceBusTrigger(“processorqueue dev”,AccessRights.Manage,Connection=“ServiceBusConnection”)]
BrokeredMessage myQueueItem,
TraceWriter日志)
{
这可能与第二个函数何时将消息发送到另一个第三个队列以供第三个函数处理有关。
它确实使用批处理静态函数发送到队列异步。它确实使用BatchSendAsync:
wait messageSender.SendBatchAsync(batchList);
如果secodn函数没有任何要发送的消息,则它似乎不会运行两次。序列号是在消息排入服务总线队列时分配给消息的唯一64位整数。同一消息不可能有两个不同的序列号
消息Id不唯一,您可以为多条消息设置相同的消息Id
我能看到的是,重复的消息可能会发送到第二个队列。请检查同一消息是否从函数多次发送到第二个队列
第一个和第二个函数的代码示例将有助于提供更多的见解
您还可以检查度量以确定发送到队列的消息总数。Azure函数保证至少传递一次消息。因此,第一个函数可以两次处理来自其服务总线队列的同一消息,将两条结果消息加载到第二个函数的队列中。您可以检查某些潜在解决方案功能中的可靠事件处理。