耐用功能,延迟不准确,以秒为单位
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.
我正在尝试创建延迟 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.