azure - Azure 的事件网格的回复策略似乎不起作用
问题描述
在过去的一周里,我一直在尝试通过带有 webhook 的事件网格来实现事件传播,但我遇到了一个问题,即使订阅者返回了一个应该触发重试的错误代码(任何https://docs. microsoft.com/en-us/azure/event-grid/delivery-and-retry#failure-codes),但它只是没有发生。显示重试策略配置。服务器当前总是以 503 响应,理论上应该将事件标记为无法传递。有什么我想念的吗?
哦,我可能应该提到我正在记录所有事件,而这些事件只发生一次。
解决方案
以下是使用死信选项测试重试策略的示例。所有功能都运行良好。
我有一个用于触发事件的自定义主题(topicTester100)
[ { "topic":null, "id":"690bb0ec-7aad-4ed9-a7a1-3b6c8899c57c", "subject":"/myapp/vehicles/motorcycles", "eventType":"retrytest", "eventTime":"2020-12-03T14:15:46.660", "data":{ "make":"Ducati", "model":"Monster" } } ]
此主题有一个订阅(Tester--17158468),具有以下属性:
{ "name":"Tester--17158468", "type":"Microsoft.EventGrid/eventSubscriptions", "id":"/subscriptions/xxxx/resourceGroups/xxxx/providers/Microsoft.EventGrid/topics/testerTopic100/providers/Microsoft.EventGrid/eventSubscriptions/Tester--17158468", "properties":{ "topic":"/subscriptions/xxxx/resourceGroups/xxxx/providers/microsoft.eventgrid/topics/testertopic100", "provisioningState":"Succeeded", "destination":{ "properties":{ "endpointUrl":null, "endpointBaseUrl":"https://xxxx.azurewebsites.net/api/HttpEventGrid", "maxEventsPerBatch":1, "preferredBatchSizeInKilobytes":64 }, "endpointType":"WebHook" }, "filter":{ "subjectBeginsWith":"", "subjectEndsWith":"" }, "labels":[ "" ], "eventDeliverySchema":"EventGridSchema", "retryPolicy":{ "maxDeliveryAttempts":4, "eventTimeToLiveInMinutes":20 }, "deadLetterDestination":{ "properties":{ "resourceId":"/subscriptions/xxxx/resourceGroups/xxxx/providers/Microsoft.Storage/storageAccounts/rk2018ebstg", "blobContainerName":"eventgrid" }, "endpointType":"StorageBlob" } } }
请注意,交付计数器 = 4和TTL = 20 分钟。
订阅者实现为 HttpTrigger 函数,其中Notification消息的逻辑如下:
else if(eventTypeHeader == "Notification") { log.LogInformation($"Notification message: [id = {jtoken["id"]}, eventType = {jtoken["eventType"]}]"); return jtoken["eventType"].Value<string>() == "retrytest" ? (ActionResult)new StatusCodeResult(503) : (ActionResult)new OkResult(); }
如您所见,如果eventType的值为retryTest,则订阅者将返回状态码 = 503,否则返回码为200。
以下屏幕片段显示了订阅者日志消息:
从上面的Logs可以看到,事件消息(id=690bb0ec-7aad-4ed9-a7a1-3b6c8899c57c)已经投递了3次,第一次立即投递,第二次1分钟后投递,最后一次如10分钟后第三个。下一次投递被安排在 60 分钟后,但是这次投递超过了订阅中的特定时间 TTL,例如 20 分钟,因此可以丢弃消息,或者如果我们打开了死信选项,则在之后发送消息5 分钟(不可配置)到 blob 存储,请参阅以下屏幕片段:
请注意,存储帐户上还有一个订阅(TESTER--169394031)订阅了与第一个相同的 weebhook 端点,这就是为什么我们可以在日志中看到基于在blob 存储。
以下屏幕片段显示了一条死信消息:
如您所见,有一条原始事件消息,其中详细说明了传递失败的原因。
推荐阅读
- java - 在不区分大小写的情况下在 treeMap 中查找键
- python - 通过python 3.7.6中的函数传递字符串变量
- scala - sbt.librarymanagement.ResolveException: 下载 org.scala-sbt:scripted-plugin_2.13:1.4.4 时出错
- google-sheets - 在 Google 电子表格上将全名转换为“姓、名”格式
- c++ - 如何在 UML 中显示地图?C++
- javascript - 多次执行axios请求只得到一个输出
- dataframe - 在 Julia 中转换 DataFrame 的多列的正确方法是什么?
- r - Plotly/Vistime - 重叠标签
- python-3.x - 混淆矩阵 - 当真/预测列都有值时的 TP
- api - 如果我的 API 受 OAuth 保护,我是否需要 Web 应用程序防火墙?