【问题标题】:How to stop an Azure WebJobs queue message from being deleted from an Azure Queue?如何阻止从 Azure 队列中删除 Azure WebJobs 队列消息?
【发布时间】:2016-08-21 03:18:51
【问题描述】:

我正在使用 Azure WebJobs 轮询队列,然后处理消息。

部分消息处理包括对第 3 方 HTTP 端点的命中。 (例如天气 api 或一些股票市场 api)。

现在,如果对 api 的访问失败(网络错误、500 错误等),我会尝试/在我的代码中捕获它,记录任何内容,然后......什么??

如果我继续......那么我假设该消息将被 WebJobs SDK 删除。

我该怎么做:

1) 对 SDK 说 - 请不要删除此消息(因此它将在下一次队列轮询时自动重试并且当消息再次可见时)。
2) 设置隐身时间值,当SDK从队列中弹出消息进行处理时。

谢谢!

【问题讨论】:

  • 根据azure.microsoft.com/en-in/documentation/articles/…此处发布的内容,我相信如果您的函数抛出错误,该消息不会被删除。您可以通过记录异常然后重新抛出该异常来尝试吗?
  • 假设您不继续/处理错误但允许它失败 - 如果您的请求失败超过 5 次 - 消息被推入另一个队列,称为 posion-{{your_queue_name}} - 您可以编写侦听此队列以处理失败消息的侦听器。请澄清你所说的隐形价值是什么意思?你的意思是锁。
  • @JS_GodBlessAll 阅读文档,5 是重试次数的默认值,但可配置。如果我们将此值设置为一个非常高的数字,那么消息将不会移动到毒队列(请参阅Manual poison message handling 部分)。我说的对吗?
  • @GauravMantri:当我使用 SDK 版本(3 个月前)时,我不确定是否配置重试,但它并没有让我这样做。但是我可以配置并且确实配置了 1) 轮询间隔 2) 和允许出队的消息数量 - 这就是我所做的。可能是较新的版本也可以让您配置故障
  • 还有@GauravMantri 和@Pure.Krome - 我相信(依稀记得)添加另一个 dll 来实现相同的效果 - 这可能适用于 CRON 作业 - 但不确定,这些值也被限制在最大值价值 - 隐藏在文档中的某个地方。

标签: azure azure-webjobs


【解决方案1】:

现在,如果对 api 的访问失败(网络错误、500 错误等),我会尝试/在我的代码中捕获它,记录任何内容,然后......什么??

Webjobs SDK 的行为如下:如果您的方法抛出未捕获的异常,则消息将返回到队列,并带有其dequeueCount 属性 +1。否则,如果一切正常,则认为消息已成功处理并从队列中删除 - 即queue.DeleteMessage(retrievedMessage);

所以不要优雅地捕获 HTTP 500,抛出异常以便 SDK 获得提示。

如果我继续......那么我假设 WebJobs SDK 将删除该消息。

来自https://github.com/Azure/azure-content/blob/master/articles/app-service-web/websites-dotnet-webjobs-sdk-get-started.md#contosoadswebjob---functionscs---generatethumbnail-method:

如果方法在完成之前失败,队列消息不会被删除;在 10 分钟的租约到期后,该消息被释放以再次被拾取和处理。如果消息总是导致异常,则不会无限期地重复此序列。在 5 次尝试处理消息失败后,该消息被移动到名为 {queuename}-poison 的队列中。最大尝试次数是可配置的。

如果您真的不喜欢硬编码的 10 分钟 可见性超时(消息对消费者隐藏的时间),您可以更改它。请参阅@mathewc 的这个答案:

来自https://stackoverflow.com/a/34093943/4148708:

在最新的 v1.1.0 版本中,您现在可以通过 JobHostConfiguration.Queues.QueueProcessorFactory 注册您自己的自定义 QueueProcessor 实例来控制可见性超时。这使您可以全局或按队列/函数控制高级消息处理行为。

https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/MiscOperations/CustomQueueProcessorFactory.cs#L63

protected override async Task ReleaseMessageAsync(CloudQueueMessage message, FunctionResult result, TimeSpan visibilityTimeout, CancellationToken cancellationToken)
{
      // demonstrates how visibility timeout for failed messages can be customized
      // the logic here could implement exponential backoff, etc.
      visibilityTimeout = TimeSpan.FromSeconds(message.DequeueCount);

      await base.ReleaseMessageAsync(message, result, visibilityTimeout, cancellationToken);
}

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-06-07
    • 2021-10-18
    • 2019-04-25
    相关资源
    最近更新 更多