2017-10-10 27 views
0

我的azure函数计算某些请求作业(cca.5s-5min)的结果,其中每个作业根据请求消息的散列值具有唯一的jobId。执行导致确定性结果。所以它在功能上是“纯粹的功能”。因此,我们将基于jobId的已评估作业的结果缓存到blob存储中。迄今为止都很棒。如何获取队列触发天青功能的运行状态?

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

  1. 结果在缓存中已经=>然后它从缓存中提供。
  2. 结果不在缓存中,并没有功能正在运行评估=>新调用
  3. 结果不在缓存中,但有些功能已经在开发它=>等待结果

我们做一些基于自定义表格存储的进度跟踪魔术来判断函数是否在给定jobId上工作或者还没有工作。

它以某种方式工作,直到5 x重新启动 - >毒性队列方案。在那里,我们相当无望。

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

如何在c#中可靠地找出给定消息(jobId)当前是否正在被某个函数处理,何时不是?

回答

0

如何在c#中可靠地找出给定消息(jobId)当前是否正在被某个函数处理,何时不是?

如果你想检测哪个消息正在处理,并得到队列中的消息ID触发Azure的功能,你可以试试下面的代码:

#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}"); 
} 
+0

感谢您的努力,但似乎您正在建议一个处理来自队列的消息的函数。我已经有一个处理消息“FunctionA”的函数,并且我希望其他函数“FunctionB”能够确定某个“FunctionA”是否已经在消息中工作。如果进程启动而不是排队新消息,则“功能B”等待结果是有意义的。 –

0

Azure的耐用功能提供了一种机制如何跟踪执行较小任务的进度。

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

Accroding的“模式#3:异步HTTP API的”协调器可以提供功能状态信息的形式是这样的:

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

这解决了我的关于发现的问题,如果给定消息正在处理中。

相关问题