Azure函数:如果引发特定异常,则不重试即可移至毒药blob

时间:2018-10-18 04:48:48

标签: c# azure-functions azure-storage-blobs

我有一个Blob触发函数,其中从Json字符串反序列化数据,然后完成进一步的过程并将数据保存到db。

我的Blob触发函数最大重试次数设置为5。这意味着如果Blob进程失败,它将重试5次,然后将Blob移至有毒Blob。

如果反序列化失败,则无需重试5次。 因此,如果引发了反序列化异常,则需要将blob移至有毒blob,而无需重试。有什么办法可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

对于这种情况afaik没有内置的解决方案,但是您可以将输出绑定添加到您的中毒队列并以此处描述的形式手动插入消息:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob#trigger---poison-blobs

  

毒药斑点的队列消息是一个JSON对象,其中包含以下属性:

     

FunctionId(格式为.Functions。)

     

BlobType(“ BlockBlob”或“ PageBlob”)

     

ContainerName

     

BlobName

     

ETag(blob版本标识符,例如:“ 0x8D1DC6E70A277EF”)

[FunctionName("blobtrigger")]
public static async Task Run(ILogger log, ExecutionContext executionContext,
    [BlobTrigger("blobs/{name}")] Stream blob,
    [Queue("webjobs-blobtrigger-poison")] CloudQueue poisonQueue)
{
    try {
        // do something
        throw new JsonSerializationException();
    }
    catch (JsonSerializationException ex)
    {
        log.LogError(ex, ex.Message);
        await poisonQueue.AddMessageAsync(new CloudQueueMessage()); // your message
    }
}

答案 1 :(得分:0)

一种更干净的方法是将maxDequeueCount设置为1。将以下内容添加到您的 host.json 文件中:

"extensions": {
  "queues": {
      "maxDequeueCount": 1
  }
}

这有效地将最大重试次数设置为0,并且一旦异常在函数中一直冒出,消息就会添加到有毒Blob队列中。

文档非常混乱,因为该设置位于队列部分中,并且看起来与blob触发器无关。

尽管如此,我仍然可以从WebJobs文档中找到它:https://docs.microsoft.com/en-us/azure/visual-studio/vs-storage-webjobs-getting-started-blobs#how-to-handle-poison-blobs