Azure函数中实例ID获取主机锁租约的原因是啥?

Posted

技术标签:

【中文标题】Azure函数中实例ID获取主机锁租约的原因是啥?【英文标题】:What is the reason for host lock lease acquired by instance id in Azure function?Azure函数中实例ID获取主机锁租约的原因是什么? 【发布时间】:2018-08-29 05:52:36 【问题描述】:

我正在运行一个具有 Azure 功能的项目,但它没有运行我的 azure 功能。我已经放了断点,它也没有达到断点。此外,输出不清楚,因此我可以调试我的代码。有什么办法可以调试代码找到问题的根本原因?

输出:

[3/20/2018 9:39:31 AM] 读取主机配置文件 'C:\Users\myname\Source\MyProject\aspnet-core\src\Nec.MyProject.Processors\bin\Debug\netstandard2.0\host.json' [2018 年 3 月 20 日上午 9:39:31] 主机配置文件读取:[3/20/2018 上午 9 点 39 分 31 秒] [2018 年 3 月 20 日上午 9 点 39 分 31 秒] “队列”: [2018 年 3 月 20 日 9 点 39 分 31 秒 AM]“maxPollingInterval”:1000,[2018 年 3 月 20 日上午 9:39:31] "visibilityTimeout": "00:00:00", [3/20/2018 9:39:31 AM] “batchSize”:1,[2018 年 3 月 20 日上午 9:39:31] “maxDequeueCount”:5 [2018 年 3 月 20 日上午 9:39:31] [2018 年 3 月 20 日上午 9:39:31] [2018 年 3 月 20 日上午 9:39:48 AM] 生成 15 个工作职能 [3/20/2018 9:39:48 AM] 启动主机 (HostId=windowsmyname-655615619, 版本=2.0.11415.0, ProcessId=6320, Debug=False,ConsecutiveErrors=0,StartupCount=1, FunctionsExtensionVersion=) [3/20/2018 9:39:49 AM] 发现以下内容 功能:[2018 年 3 月 20 日上午 9:39:49] MyCompany.MyProject.Processors.BackOfficeFilesGeneratorJobs.RunTestGeneratorAsync [3/20/2018 9:39:49 AM] [3/20/2018 9:39:49 AM] 作业主机已启动 收听http://localhost:7071/ 按CTRL-C 退出... [2018 年 3 月 20 日 9:39:50 AM] 实例 ID 获取主机锁租约 '0000000000000000000000000C78D3496'。

Azure 函数:

[FunctionName("GenerateTestOfficeMasterDataFiles")]
public static async Task RunTestGeneratorAsync(
    [QueueTrigger("%MasterDataFiles:Supplier:QueueName%", Connection = "ConnectionStrings:BlobStorageAccount")] BackOfficeFileGeneratorMessage<string> message,
    ExecutionContext context,
    TraceWriter log)

注意:当它是 BackOfficeFileGeneratorMessage 而不是 BackOfficeFileGeneratorMessage&lt;string&gt; 时,它工作正常。

更新:

public class BackOfficeFileGeneratorMessage<TEntityKey>

    public BackOfficeFileGeneratorMessage()
    
        Items = new MasterDataFileOperationItem <TEntityKey>[0];
    
    public bool UseStaging  get; set; 
    public string StoreNo  get; set; 
    public bool RefreshAll  get; set; 
    public IEnumerable<MasterDataFileOperationItem <TEntityKey>> Items  get; set; 

【问题讨论】:

您要触发的队列中有消息吗? 【参考方案1】:

函数运行时使用特定于函数应用的唯一 ID 获取附加到函数应用的 storage account 的租约。这是一个内部实现细节。

只要队列触发器数据与 POCO 匹配,反序列化为泛型类型就应该有效。例如,这里是泛型类型

public class GenericInput<T>

    public T OrderId  get; set; 

    public T CustomerName  get; set; 

和功能

 public static void ProcessQueueMessage([QueueTrigger("queuea")] GenericInput<string> message, TextWriter log)
    
        log.WriteLine(message);
    

队列数据示例


  "OrderId" : 1,
  "CustomerName" : "john" 

如果无法将队列数据序列化为预期的 GenericType,您将收到序列化错误。例如,以下函数将无法尝试处理错误的队列输入: 功能:

public static void ProcessQueueMessage([QueueTrigger("queuea")] GenericInput<int> message, TextWriter log)
    
        log.WriteLine(message);
    

输入错误:


 "OrderId" : 1,
 "CustomerName" : "cannot covert string to number" 

【讨论】:

在本地调试时,您应该会在控制台上看到错误。部署到 Azure 时,应用程序洞察力将包含详细日志。序列化队列数据发生在执行功能代码之前。因此,您将无法在函数代码中命中断点。你能用 BackOfficeFileGeneratorMessage 的代码更新问题吗? 我在本地调试,在控制台看不到我的错误。 无法调试队列数据? 有什么办法可以查看或更改这种预处理方法吗? 更新问题,格式错误,我是手机打的,请查收。【参考方案2】:

只需将下一个 key:value 添加到 hosts.json:

"singleton": 
    "listenerLockPeriod": "00:00:15" 
  

【讨论】:

【参考方案3】:

如果您在 blob 上上传文件并对其运行触发器,则该文件将仅被读取一次。如果您需要为同一个文件再次运行该功能,这是不可能的。 您可以从 blob 中删除文件并使用 UI(这将用作新触发器)再次将其放在那里,或者更改您机器上函数的路径并将文件保留在 blob 中。

【讨论】:

以上是关于Azure函数中实例ID获取主机锁租约的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 队列中基于租约和基于锁的独占访问之间的区别

Azure 发布管道任务。 Blob 当前存在租约,请求中未指定租约 ID

Azure 事件中心接收器中的分区 ID、偏移量、主机名是啥?

“MaxAutoRenewDuration”在 Azure 服务总线中的作用是啥?

etcd 租约Watch功能分布式锁的golang实践

cloudera manager在WEB界面集群安装时,提示:正在获取安装锁,然后就走不动了。请问是啥原因?