Azure Functions中的azure-webjobs-hosts存储容器中的“host”blob的用途是什么?

lmvvr0a8  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(97)

我有一个Azure Function App,其中Python函数已启用服务总线触发器。我注意到在与Function App关联的存储帐户中,有一个名为azure-webjobs-hosts的存储容器,其中有一个名为locks的文件夹。它有几个文件夹,其名称与我的Function App完全相同(或者我的App Service计划,不确定,因为它们的名字是一样的),而且它们每个里面都有一个hosts文件。我的函数应用被扩展到多个示例。每当我为我的一个函数应用检查hosts文件时,blob的元数据总是包含单个条目,如this。我花了无数个小时试图了解幕后发生了什么,因为我有多个示例正在运行,但只有一个“FunctionInstance”租用此blob。这是否会影响其他示例处理我的服务总线队列消息?为什么这个blob始终只被其中一个示例租用?(如果我重启Function App,重启后它可能会被另一个示例ID租用,所以我猜它通常是该Function App的一个示例的ID,但根据元数据,它确实是由单个示例租用的)即使我在这里没有受到影响,你能提供一个例子吗?Azure Functions使用这个hosts文件,以及为什么它在启动时试图锁定?
我开始在本地进行实验,以更好地理解正在发生的事情。我发现如下:(使用func start)向这个blob发出一个HEAD请求,然后使用comp=lease URL参数向这个blob发出一个PUT请求,然后是另一个HEAD请求,最后在另一个使用comp=metadata URL参数的PUT请求之后,我得到以下日志行:Host lock lease acquired by instance ID '000000000000000000000000711A638F'.在此之后,它开始处理来自队列的服务总线消息。然而,我在此机器上启动的第二个函数从未获得Host lock lease acquired by instance ID 'xxx'.消息,它定期向此blob发送HEAD请求,并且似乎从未获取blob用于租用。然而,该第二个函数也由队列中的消息触发,并像第一个函数那样按预期处理它们。
请解释learning hosts文件背后的逻辑。(PS:我有我的函数应用程序扩展到3个示例,我有Azure函数高级计划)

qyzbxkaa

qyzbxkaa1#

  • 主机锁租约文件保存在链接到Function App的存储帐户中的azure-webjobs-hosts容器中。
  • 需要这些文件来确保Function App一次只处理一个示例中的服务总线队列中的消息。Function App示例在启动时尝试获取主机锁文件的租约。如果成功,它将开始分析队列中的消息。如果不起作用,它定期检查租用的状态,并且一旦租用变得可用就开始处理消息。
  • 在azure-webjobs-hosts容器中,locks文件夹包含为每个Function App示例命名的文件夹。每个文件夹中都存在包含示例租约信息的主机文件。由于一次只能有一个Function App示例持有租约,因此blob的元数据始终只有一个条目。
  • Azure Functions使用locks文件夹为Function App实现单例行为。由于单例行为,一次只有一个Function App示例处理来自服务总线队列的消息。
  • 主机ID冲突检测功能也是使用locks文件夹实现的。Functions runtime 3.x版本以后检测主机ID冲突并记录警告。4.x版本通过记录错误并停止主机来导致硬故障。您可以在此处获得有关主机ID冲突的更多信息

x1c 0d1x的数据



根据这个博客:
而 *azure-webjobs-host * 容器则托管三个文件夹:

  • 心跳-包含对服务执行的每个心跳检查的0字节日志。
  • Ids -包含一个单独的博客目录,该目录具有此服务的唯一标识符。
  • 输出日志-为每次运行生成详细日志的输出。显式日志是由WebJob开发人员添加到运行时代码中的日志。

相关问题