【问题标题】:Azure Service Bus: Maximum execution time of message processingAzure 服务总线:消息处理的最大执行时间
【发布时间】:2020-09-23 07:38:41
【问题描述】:

简短的问题:如果处理消息所花费的时间超过给定的限制,我们希望抛出异常。

更长的问题:我们有几个本地应用程序作为 Windows 服务运行,侦听 Azure 服务总线订阅上的消息,以及写入 Azure Blob 存储的其他内容。

我们对服务总线或一般消息传递没有任何问题。服务总线 SDK 似乎运行良好。

问题在于我们的应用程序逻辑,在收到消息后,我们对外部服务(如 SQL 服务器)进行了大量调用。 Oracle DB、blob 存储、Web API。我们发现对 blob 存储的调用突然开始挂起,即什么也没发生,并且这发生在同一台机器上的多个应用程序中。 症状是消息没有被处理。由于问题是调用 blob 存储由于某种原因没有响应,解决方案是在 blob 客户端上设置 MaximumExecutionTime。有了这个,我们会在指定的超时后得到一个 TaskCanceledException,而不是永远等待(直到应用程序重新启动)

我想知道的是是否可以在 SubsciptionClient 中设置最大执行时间。不是为了获取消息,而是为了我们对消息的处理。或者我们是否必须自己在回调(消息处理程序)中实现它。

【问题讨论】:

  • 好吧,我认为解决 Blob 连接问题的根本原因是最好的办法。其他东西只是一种解决方法
  • 是的,你是对的,我们已经修复了它。我们担心的是,我们已经运行了多年没有 MaximumExecutionTime 没有任何问题,突然之间就出现了问题。如果应用程序的其他地方发生类似情况,我们希望有一个保障措施。
  • 我之前遇到过这个问题,我们已经像你一样在messageHandler(客户订阅)中实施了解决方案。

标签: azure azureservicebus


【解决方案1】:

您可以尝试设置OperationTimeout 属性,该属性指定消息操作在超时之前必须完成多长时间。

您可以使用如下代码更改超时:

MessagingFactorySettings settings = new MessagingFactorySettings { 
            OperationTimeout = new TimeSpan(0, 2, 0), 
            TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("issuer", "sharedkey") };

var address = ServiceBusEnvironment.CreateServiceUri("sb", "serviceNamespace", string.Empty);
var messagingFactory = MessagingFactory.Create(address, settings);

return messagingFactory.CreateSubscriptionClient("subName");

【讨论】:

  • 我认为这个设置可能只是为了获取消息给客户端的操作,而不是为了在应用程序中自定义处理消息。我们使用此设置的默认值,而且我们的应用程序肯定在单个消息上花费了更多时间。
猜你喜欢
  • 2015-03-07
  • 2013-05-22
  • 2020-07-20
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
相关资源
最近更新 更多