在使用ServiceBus队列触发器的消费计划中运行时,Azure功能将变为空闲状态

时间:2017-10-26 20:26:33

标签: azure azure-functions azureservicebus

我也在MSDN Azure forums中提出了这个问题,但没有收到任何有关我的功能闲置原因的指导。

我有一个在消耗计划上运行的Azure功能,该计划空闲(即不响应ServiceBus触发器队列上的新消息),尽管遵循此GitHub issue中列出的说明:

该功能的配置如下json:

{
  "ConnectionStrings": {
    "MyConnectionString": "Server=tcp:project.database.windows.net,1433;Database=myDB;User ID=user@project;Password=password;Encrypt=True;Connection Timeout=30;"
  },
  "Values": {
    "serviceBusConnection": "Endpoint=sb://project.servicebus.windows.net/;SharedAccessKeyName=SharedAccessKeyName;SharedAccessKey=KEY_HERE",
  }
}

功能签名是:

public static void ProcessQueue([ServiceBusTrigger("queueName", AccessRights.Listen, Connection = "serviceBusConnection")] ...)

根据GitHub问题中的讨论,我认为拥有serviceBusConnection条目或AzureWebJobServiceBus条目应足以确保中央侦听器在添加新消息时触发该函数到了ServiceBusQueue,但事实证明并非如此。

任何人都可以澄清这两个设置的使用方式之间的区别,或者注意我提供的其他设置可能会导致在一段时间不活动后无法正确触发该功能吗?

1 个答案:

答案 0 :(得分:1)

我建议这种行为有几种可能的原因。我有几个Azure子服务器,其中只有一个存在基于存储/服务总线的触发器问题,只有当应用程序不空闲时才会弹出。到目前为止,我发现下面列出的操作会阻止触发器正常工作:

  • 创建任何基于存储的触发器,删除(出于任何原因)触发对象并重新创建它。
  • 通过删除/更改关联对象而不重新编译功能来破坏azure函数输入参数

当其中一个函数无法编译/绑定以触发OR输入参数并挂起时,重新启动函数app可能会导致同样的问题。 还观察到使用传统的连接字符串设置进行触发器绑定将不起作用。

受影响的功能应用程序的

清理部署很可能会解决问题,如果它是由上述任何操作引起的。

修改: 看起来这也是由于在功能应用上设置了授权/身份验证,但我还没有弄清楚它是否一般发生或者当Auth具有特定配置时。通过完全禁用auth测试受影响的Azure子 - 在30-40分钟后函数进入空闲状态,队列触发器仍会启动执行,但会有预期的延迟。我找到了与此相关的旧bug,但它说问题已解决。