耐用功能,延迟不准确,以秒为单位

Durable Function, delay not accurate in seconds

我正在尝试创建延迟 x 秒的持久函数。不幸的是,x 越大,误差越大。

我正在使用 MS docs:

中显示的示例

function.json:

{
  "bindings": [
    {
      "name": "context",
      "type": "orchestrationTrigger",
      "direction": "in"
    }
  ],
  "scriptFile": "../dist/function/index.js"
}
const deadline = moment.utc(context.df.currentUtcDateTime).add(60, 'seconds');
yield context.df.createTimer(deadline.toDate());
context.df.callActivity("SendBillingEvent");

如果我将计时器增加 60 秒,则会有大约 20 秒的额外延迟。持久功能本身就是不准确的,还是有其他方法可以使用延迟来激活功能?


日志显示:

[2021-02-20T09:23:03.878Z] the timer is: n {
[2021-02-20T09:23:03.878Z]   isCompleted: true,
[2021-02-20T09:23:03.878Z]   isFaulted: false,
[2021-02-20T09:23:03.878Z]   action: {
[2021-02-20T09:23:03.878Z]     fireAt: 2021-02-20T09:22:43.503Z,
[2021-02-20T09:23:03.878Z]     isCanceled: false,
[2021-02-20T09:23:03.878Z]     actionType: 5
[2021-02-20T09:23:03.879Z]   },
[2021-02-20T09:23:03.879Z]   result: undefined,
[2021-02-20T09:23:03.879Z]   timestamp: '2021-02-20T09:21:43.662554Z',
[2021-02-20T09:23:03.879Z]   id: 0,
[2021-02-20T09:23:03.879Z]   exception: undefined,
[2021-02-20T09:23:03.879Z]   completionIndex: 5,
[2021-02-20T09:23:03.879Z]   wasYielded: false
[2021-02-20T09:23:03.879Z] }

由于计时器的创建方式,我认为它不准确。 使用标准 Azure 存储持久性提供程序时,将使用存储队列上的计划消息。 本质上,DF 向队列中添加一条消息,该消息计划在您设置的时间可见。

实例 运行 编排器通过轮询队列定期检查新消息。 因此,在消息变得可见和下一个消息轮询请求之间很可能存在延迟。 然后当它收到消息时,DF 必须从 history table 中加载实例历史,然后再次执行 orchestrator。 这也增加了一些开销。

DF 使用的持久任务框架允许使用不同的持久性提供程序。 其中一些可能会提供更精确的计时器。 但据我所知,您不能将 DF 配置为使用不同的。

您也可以尝试调整消息的轮询频率:https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale#queue-polling。 具体来说,host.json中有一个maxQueuePollingInterval属性默认为00:00:30(30秒)。 所以当DF检查队列发现没有消息时,它会增加下一次轮询时间,直到达到这里设置的max。 在此处查看 host.json 文档以查看设置 属性 的位置:https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-bindings#host-json.