【发布时间】:2020-10-01 09:14:05
【问题描述】:
我有 Azure Main 函数应用程序,它处理来自服务总线的消息。
如果由于 API 关闭而发生异常,则我将消息推送到死信队列。
我有另一个 azure Dead 函数应用程序,它不断读取 DLQ 并将消息推回主队列。
主函数应用程序检查 api 是否关闭,然后再次将消息推送到 DLQ,这应该一直持续到 API 启动并且主函数应用程序成功处理消息。
但问题是一段时间后消息会自动清除。
我检查了默认消息生存时间是 2 小时 30 分钟,但消息无法在那里停留这么长时间。当我将消息推送回 Main 时,我认为在 Dead Function 应用程序中。主队列中的消息可能被识别为重复但不确定。
对于给定的默认消息生存时间,我应该如何将消息维持到 DLQ?
将消息推回主队列的死信函数应用代码 -
MessageSender sender = new MessageSender(Environment.GetEnvironmentVariable("ConnectionStringSettingName"), UtilityHelper.GetAndValidateAppSetting("TopicName"), RetryPolicy.Default);
Message deadLetterMessage = new Message(message.Body);
foreach (KeyValuePair<string, object> userProperty in message.UserProperties)
{
deadLetterMessage.UserProperties.Add(userProperty.Key, userProperty.Value);
}
//Send the message to the Active Queue
await sender.SendAsync(deadLetterMessage);
主要功能应用代码-
[FunctionName("ProcessMessage")]
public static async System.Threading.Tasks.Task RunAsync([ServiceBusTrigger("mytopic", "mysub", Connection = "ConnectionStringSettingName")]Message mySbMsg, string lockToken, MessageReceiver messageReceiver, ILogger log)
{
try
{
log.LogInformation("Process message...");
}
catch (Exception ex)
{
log.LogInformation($"Send message to dead-letter: {ex}");
await messageReceiver.DeadLetterAsync(lockToken);
}
}
我的逻辑是:在 API 启动之前,我将消息发送到 DLQ 和 DLQ 函数应用程序将其推回主队列,这样我就不会丢失消息。
更新
找出根本原因:
Microsoft.Azure.ServiceBus.ServiceBusCommunicationException:一个 无法对套接字执行操作,因为系统缺少 足够的缓冲区空间或因为队列已满错误代码: NoBufferSpaceAvailable ---> System.Net.Sockets.SocketException: An 无法对套接字执行操作,因为系统缺少 足够的缓冲区空间或因为队列已满 Microsoft.Azure.ServiceBus.ServiceBusConnection.CreateConnectionAsync(时间跨度 超时)
如何解决这个问题?
【问题讨论】:
-
这个问题在编辑之前处于非常不可读的状态。有不是引号的引号块,不是代码的内联代码格式,以及未标记为更新的上下文更新,被编辑到问题的开头。我觉得这超出了一个仅仅不清楚的问题的普通水平,并且反映了对接近破坏行为的过度格式化的依恋。
标签: c# azure azureservicebus azure-function-app