如何获取队列触发的azure函数的运行时状态?

时间:2017-10-10 21:00:30

标签: azure azure-functions azure-webjobs azure-queues

我的azure函数正在计算某些请求作业的结果(cca.5s-5min),其中每个作业都具有基于请求消息的散列的唯一jobId。执行导致确定性结果。所以它在功能上是纯粹的功能"。因此,我们基于jobId将已评估作业的结果缓存在blob存储中。到目前为止一切都很棒。

现在,如果对jobId的请求出现三种情况是可能的。

  1. 结果已在缓存中= =>然后它从缓存中提供。
  2. 结果不在缓存中,并且没有函数正在运行evaluate =>新的调用
  3. 结果不在缓存中,但某些功能已在其上工作=>等待结果
  4. 我们做了一些基于自定义表存储的进度跟踪魔术来判断函数是否在给定jobId上工作。

    它以某种方式工作,直到5 x重启点 - >毒物队列场景。在那里,我们完全没有希望了。

    我觉得我们正在攻击Azure功能内部的一些已经可靠实现的功能,因为在azure门户中的监视器页面中可以看到完全相同的信息,或者曾经在kudu webjobs监视器页面中可见。

    如何在c#中可靠地找出某个函数当前是否正在处理给定的消息(jobId)以及何时不处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

Azure Durable Functions提供了一种如何跟踪较小任务执行进度的机制。

https://docs.microsoft.com/en-us/azure/azure-functions/durable-functions-overview

协调到“模式#3:异步HTTP API”,协调器可以提供有关函数状态的信息,如下所示:

  {"runtimeStatus":"Running","lastUpdatedTime":"2017-03-16T21:20:47Z", ...}

这解决了我发现是否正在处理给定消息的问题。

答案 1 :(得分:0)

  

如何在c#中可靠地找出某个函数当前是否正在处理给定的消息(jobId)以及何时不处理它?<​​/ p>

如果您想检测正在处理哪条消息并在队列触发的Azure功能中获取消息ID,您可以尝试以下代码:

#r "Microsoft.WindowsAzure.Storage"
using System;
using Microsoft.WindowsAzure.Storage.Queue; 

public static void Run(CloudQueueMessage myQueueItem, TraceWriter log)
{
    log.Info($"messageid: {myQueueItem.Id}, messagebody: {myQueueItem.AsString}");
}