繁体   English   中英

Azure 服务总线死信队列消息无法在死信中停留更长时间

[英]Azure service bus deadletter queue message unable to stay in deadletter for longer time

我有 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:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满 ErrorCode: NoBufferSpaceAvailable ---> System.Net.Sockets.SocketException: 对套接字的操作无法执行,因为系统缺乏足够的缓冲区空间或因为队列已满 Microsoft.Azure.ServiceBus.ServiceBusConnection.CreateConnectionAsync(TimeSpan timeout)

如何解决这个问题?

默认消息的生存时间设置不适用于死信。 根据文档

没有自动清理 DLQ。 消息将保留在 DLQ 中,直到您从 DLQ 中明确检索它们并对死信消息调用 Complete()。

上面将死信消息返回到原始队列的函数的代码将完成每条死信消息,这些消息将从死信队列中消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM