【问题标题】:setTimeout in Azure environmentAzure 环境中的 setTimeout
【发布时间】:2022-01-06 07:52:46
【问题描述】:

我想编写一个应用程序,将通过 http 传入的数据存储到数据库中。 数据包含有关下一个请求将在多长时间内到达的信息,例如 10 分钟。 我需要一个在请求未及时到达时通知管理员的功能。 假设这将部署在 Azure 上,我应该如何实现这个计时器?

一个简单的实现就是(例如在 Node.js 中):

const timeoutIds = {}

app.post("/endpoint", (req, res) =>{
    const {id, willArriveInXMinutes} = req.data;
    clearTimeout(timeoutIds[id]); // clear timer if set 
    setTimeout((...params)=>alertUser(params),willArriveInXMinutes*(60*1000),id); //set a new timer 

    //do the needful
});

如果我将它部署在 VM 上,这很好,但最好我想使用 Web 应用服务,甚至是 Azure 函数。 在前者的情况下,我可以这样做,但在等待计时器到期时我会被收费。在后者的情况下,执行的最大长度为 10 分钟。我希望等待时间灵活,所以这也是不行的。

我想过使用事件队列,但我认为这仍然不能解决等待 X 分钟的问题(因为它是实时的),而且显然是矫枉过正。

你碰巧有一个很好的方法来实现这个吗?

【问题讨论】:

    标签: azure azure-functions azure-web-app-service


    【解决方案1】:

    是的,消耗计划有一个超时限制,但它是一个节省成本的有吸引力的计划,如果您在代码中遇到死锁,它可以防止成本意外流失。

    • 关于专用应用服务计划功能超时,执行超时没有上限。要启用“无限执行时间”,可以将functionTimout 配置设置为-1 的值。但是,强烈建议保持一个固定的上限,以防止应用陷入无限循环。

    • 或者,Azure Web 作业没有任何执行运行时超时限制。

    • 您需要将门户中的 SCM_COMMAND_IDLE_TIMEOUT 设置为所需的超时值(以秒为单位)。例如,将其设置为 3600 以表示一小时超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2011-06-11
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多