azure-functions - Azure 函数偶尔会运行两次
问题描述
我有一个在每周一早上 8 点运行一次的计时器上运行的 Powershell 函数——它发送电子邮件。它大部分时间都运行良好,但每隔一段时间它就会运行两次:
第二个实例在第一个实例完成的确切时间运行。
我用谷歌搜索了这个问题,大多数文章都围绕着runatstartup=true。我从来没有在任何地方设置过,并且检查了函数应用程序配置和 function.json 并且找不到任何提及它。
解决方案
从文档
编写无状态函数
如果可能,函数应该是无状态和幂等的。将任何所需的状态信息与您的数据相关联。例如,正在处理的订单可能有关联的状态成员。函数可以根据该状态处理订单,而函数本身保持无状态。
幂等函数特别推荐与定时器触发器一起使用。例如,如果您有绝对必须每天运行一次的东西,请将其编写为可以在一天中的任何时间运行并获得相同的结果。当某一天没有工作时,该功能可以退出。此外,如果上一次运行未能完成,下一次运行应该从它停止的地方继续。
您可能还应该阅读有关可重入的 wiki
Azure 函数保证至少一次消息传递,因此在某些(尽管希望很少)情况下可以多次执行。
对于您的问题,这意味着跟踪已发送的电子邮件。函数运行时之外的某个地方(即:存储帐户)。当函数在同一天或同一周(取决于您的要求)开始时,从它离开的地方开始。
这是最佳实践的原因。由于您正在运行作业,因此在运行代码时可能会发生任何事情。服务器可能会崩溃,网络可能会出现故障,您的功能可能会移动到不同的主机,打补丁,...
推荐阅读
- mariadb - Windows 10 上 MariaDB 中的查询日志记录
- docker - 如何在 Google Cloud Build 中为 Kaniko 使用非执行入口点(启用构建参数定义)
- plot - 可以在 Vega-Lite 上写 Latex 吗?
- javascript - JS document.getElementById.value 无法正常工作
- slickgrid - Angular slickgrid 编辑处理程序不会在从下拉列表中选择相同的值时触发
- javascript - Javascript,类型错误:Information.map 不是函数 || 如何使用.map?
- ios - 您如何更改 Google Maps 的集群图标?
- python - Delete in Tkinter Python
- java - Talend Studio 中的 java.lang.NoClassDefFoundError
- php - PHP将获取变量添加到URL