我有一个带有几个队列触发函数的Azure webjob . https://docs.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to#config处的SDK文档将 MaxDequeueCount
属性定义为:
队列消息发送到中毒队列之前的最大重试次数(默认值为5) .
但我没有看到这种行为 . 在我的webjob中我得到了:
JobHostConfiguration config = new JobHostConfiguration();
config.Queues.MaxDequeueCount = 1;
JobHost host = new JobHost(config);
host.RunAndBlock();
然后我有一个队列触发的函数,我抛出一个异常:
public void ProcessQueueMessage([QueueTrigger("azurewejobtestingqueue")] string item, TextWriter logger)
{
if ( item == "exception" )
{
throw new Exception();
}
}
查看webjobs仪表板,我看到SDK进行了5次尝试(5是默认值,如上所述):
在第5次尝试之后,消息被移动到毒药队列 . 我希望看到1次重试(或没有重试?)而不是5次 .
更新:启用Web应用程序的详细日志记录,并选择将这些日志保存到Azure Blob容器 . 找到一些与我的问题相关的日志,位于 azure-jobs-host-archive
容器中 . 这是一个示例,显示出队计数为96的项目:
{
"Type": "FunctionCompleted",
"EndTime": "2017-02-22T00:07:40.8133081+00:00",
"Failure": {
"ExceptionType": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException",
"ExceptionDetails": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: ItemProcessor.ProcessQueueMessage ---> MyApp.Exceptions.MySpecialAppExceptionType: Exception of type 'MyApp.Exceptions.MySpecialAppExceptionType' was thrown.
},
"ParameterLogs": {},
"FunctionInstanceId": "1ffac7b0-1290-4343-8ee1-2af0d39ae2c9",
"Function": {
"Id": "MyApp.Processors.ItemProcessor.ProcessQueueMessage",
"FullName": "MyApp.Processors.ItemProcessor.ProcessQueueMessage",
"ShortName": "ItemProcessor.ProcessQueueMessage",
"Parameters": [
{
"Type": "QueueTrigger",
"AccountName": "MyStorageAccount",
"QueueName": "stuff-processor",
"Name": "sourceFeedItemQueueItem"
},
{
"Type": "BindingData",
"Name": "dequeueCount"
},
{
"Type": "ParameterDescriptor",
"Name": "logger"
}
]
},
"Arguments": {
"sourceFeedItemQueueItem": "{\"SourceFeedUpdateID\":437530,\"PodcastFeedID\":\"2d48D2sf2\"}",
"dequeueCount": "96",
"logger": null
},
"Reason": "AutomaticTrigger",
"ReasonDetails": "New queue message detected on 'stuff-processor'.",
"StartTime": "2017-02-22T00:07:40.6017341+00:00",
"OutputBlob": {
"ContainerName": "azure-webjobs-hosts",
"BlobName": "output-logs/1ffd3c7b012c043438ed12af0d39ae2c9.txt"
},
"ParameterLogBlob": {
"ContainerName": "azure-webjobs-hosts",
"BlobName": "output-logs/1cf2c1b012sa0d3438ee12daf0d39ae2c9.params.txt"
},
"LogLevel": "Info",
"HostInstanceId": "d1825bdb-d92a-4657-81a4-36253e01ea5e",
"HostDisplayName": "ItemProcessor",
"SharedQueueName": "azure-webjobs-host-490daea03c70316f8aa2509438afe8ef",
"InstanceQueueName": "azure-webjobs-host-d18252sdbd92a4657d1a436253e01ea5e",
"Heartbeat": {
"SharedContainerName": "azure-webjobs-hosts",
"SharedDirectoryName": "heartbeats/490baea03cfdfd0416f8aa25aqr438afe8ef",
"InstanceBlobName": "zd1825bdbdsdgga465781a436q53e01ea5e",
"ExpirationInSeconds": 45
},
"WebJobRunIdentifier": {
"WebSiteName": "myappengine",
"JobType": "Continuous",
"JobName": "ItemProcessor",
"RunId": ""
}
}
我正在进一步寻找的是日志,它会显示特定队列项的详细信息,其中处理成功(因此从队列中删除)或由于异常而失败并放置在毒性队列中 . 到目前为止,我还没有找到任何显示详细信息的日志 . 上面输出中引用的日志文件不包含此类数据 .
更新2:看看我的毒药队列的状态,看起来它可能是一支冒烟的枪,但我太密集了,不能把2和2放在一起 . 查看下面队列的屏幕截图,您可以多次看到带有ID(左列) 431210
的消息 . 多次出现这一事实告诉我原始队列中的消息未正确失败 .
5 回答
正如Rob W所述,使用WindowsAzure.Storage> 7.1.2时存在此问题 . 这个问题显然已在_2524666中修复,但尚未将其发布 .
贡献者asifferman在issue #985上共享了code snippet in a comment post . 这似乎解决了这个问题(它对我很有用) .
如果链接腐烂,并满足SO规则,这里的帖子和代码片段:
如果您仍在寻求答案,我们会尝试列出一些未成功的答案 . 事实证明,这是Storage sdk(WindowsAzure.Storage)和Webjob sdk(Microsoft.Azure.WebJobs)的版本问题 . 为了解决这个问题,我们最终不得不将我们的Storage sdk版本降级到7.2.1(我们最近升级到8.1.1) . 根据下面的文章,工程师现在已经意识到了这些问题,并希望很快就能解决这个问题:
https://github.com/Azure/azure-webjobs-sdk/issues/1045
如果我配置它,MaxDequeueCount属性可以正常工作 .
所以它不适合你,这很奇怪 . 当我设置
config.Queues.MaxDequeueCount = 2;
然后我得到预期的结果请参考截图 .我们也可以使用
dequeueCount
来控制重试次数 . 以下是没有尝试的演示代码 .日志信息请参考屏幕截图
我怀疑这是因为你实际上并没有运行你认为你在Azure中的二进制文件 . 这个也把我扔了一个循环 .
当您在Azure上运行触发的WebJobs时,发布新版本的WebJob不会导致旧的触发WebJob立即卸载并启动新的WebJob . 如果您查看WebJob日志,我怀疑您在重新发布时不会看到重新启动 .
这是因为Kudu默认将所有WebJob文件复制到临时目录并执行它们 . 来自Kudu WebJob docs:
我确保新发布的触发WebJob实际运行的唯一成功就是做到了以下:
登录Kudu控制台 . 这是https://yourappname.scm.azurewebsites.net . 您将使用登录Azure门户时所执行的相同凭据 .
登录后,单击顶部的Process Explorer菜单选项 . 找到当前正在运行的WebJob进程并将其终止 .
FTP到您的Web应用程序 . 浏览到包含WebJob代码的目录,然后将其删除 . 它应该在/ app_data / jobs / triggered / [你的webjob名称]下 .
然后我跳到门户网站,浏览到托管WebJob的Web App管理刀片,单击WebJobs菜单选项,并确认旧的WebJob不再存在 .
从Visual Studio发布我的新WebJob .
这应该保证您正在运行您发布的代码 . 希望这可以帮助 .
我看到同样的事情,消息超过了最大出列计数 . 我会稍微发布一些细节,但我也看到了毒药队列中最后一个非常大的数字 . 所以我怀疑它是在5之后添加到毒物队列,但是尝试更多,最终在毒药队列中有很多(数百) .