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<string>
时,它工作正常。
更新:
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 发布管道任务。 Blob 当前存在租约,请求中未指定租约 ID
Azure 事件中心接收器中的分区 ID、偏移量、主机名是啥?