【发布时间】:2020-11-14 00:17:43
【问题描述】:
我有两个 Azure Functions。一个是HTTP触发的,我们称之为API,另一个是ServiceBusQueue触发,我们称之为Listener。
第一个(API)将 HTTP 请求放入队列,第二个(监听器)拾取并处理该请求。函数SDK版本为:3.0.7。
为此,我的解决方案中有两个项目。一个包含 Azure Functions,另一个包含服务。 API 一旦被触发,就会调用另一个项目的服务,将消息放入队列。而Listener一旦收到消息,就会从服务项目中调用一个服务来处理消息。
任何长时间运行的进程?
Listener 实际上执行了一个轻量级的工作流程,考虑到它执行的工作量,这一切都发生得非常快。平均执行时间为90 seconds。
队列规范是什么?
侦听器侦听并托管在 Azure ServiceBus 命名空间中的队列具有以下属性集:
- 最大交付次数:1
- 消息生存时间:1 天
- 自动删除:从不
- 重复检测窗口:10 分钟
- 消息锁定持续时间:5 分钟
这里是它的截图:
API 使用以下方法将 HTTP 请求放入队列:
public async Task ProduceAsync(string queueName, string jsonMessage)
{
jsonMessage.NotNull();
queueName.NotNull();
IQueueClient client = new QueueClient(Environment.GetEnvironmentVariable("ServiceBusConnectionString"), queueName, ReceiveMode.PeekLock)
{
OperationTimeout = TimeSpan.FromMinutes(5)
};
await client.SendAsync(new Message(Encoding.UTF8.GetBytes(jsonMessage)));
if (!client.IsClosedOrClosing)
{
await client.CloseAsync();
}
}
而Listener(服务总线队列触发azure函数),有如下代码处理消息:
[FunctionName(nameof(UpdateBookingCalendarListenerFunction))]
public async Task Run([ServiceBusTrigger(ServiceBusConstants.UpdateBookingQueue, Connection = ServiceBusConstants.ConnectionStringKey)] string message)
{
var data = JsonConvert.DeserializeObject<UpdateBookingCalendarRequest>(message);
_telemetryClient.TrackTrace($"{nameof(UpdateBookingCalendarListenerFunction)} picked up a message at {DateTime.Now}. Data: {data}");
await _workflowHandler.HandleAsync(data);
}
问题
Listener 函数处理相同的消息3 次!我不知道为什么!我在 Google 上搜索并阅读了一些 StackOverFlow 线程,例如 this one。看起来每个人都建议确保lock duration 足够长,以使该过程完全执行。虽然,我已经为锁输入了5 minutes,但是问题仍然存在。我非常感谢您对此的任何帮助。
【问题讨论】:
标签: c# azure-functions azure-servicebus-queues