[英]How to postponed event trigger/receive
SUM:如何在 azure 事件網格中推遲事件觸發或事件接收?
我設計的系統需要對低頻 OBJECT 狀態(創建、啟動、檢查長時間處於啟動狀態、結束)做出反應。 它看起來像是事件處理的候選者。 我想用 azure 函數來實現它......問題是我需要對處於 STARTED 狀態的 10 分鍾(可配置)的 OBJECT 做出反應。 在事件發生后 10 分鍾做出反應。 如何延遲事件觸發? 如何安排事件火? 如何等待事件? 我正在尋找不會消耗我的付費資源(函數處理時間)的解決方案。 知道如何解決這個 posponing 嗎? 謝謝你。
功能一:
功能二:
功能3:???
...
在事件發生后 10 分鍾做出反應。
首先我要強調的是,事件應該代表過去發生的事情,而不是將來會發生的事情。 對事件的期望是通知發生了什么。
其次,如果您對需要發生的事情有預期,那么命令比事件好。 在這種情況下,您希望工作在 10 分鍾內在 blob 上發生,該 blob 將處於它實際可用於工作的狀態。 我會通過將延遲消息發送到隊列(Azure 服務總線)來響應事件,其中包含處理 blob 所需的信息。 這樣您就可以通過准備未來/延遲的工作項來響應事件。
如何在 azure 事件網格中推遲事件觸發或事件接收?
Azure 事件網格 (AEG) 沒有內置此功能,但是很容易使用 Azure 服務總線 (ASB) 實體擴展它來處理延遲(計划)消息,就像肖恩的回答中提到的那樣。
以下屏幕片段顯示了具有延遲訂閱者的推拉的概念:
事件消息被推送到 ASB 主題中,並根據其訂閱規則,將事件消息作為調度消息轉發到隊列實體。
主題訂閱需要設置以下屬性:
轉發
name of the queue/topic entity
$默認規則
篩選:
1=1
操作(例如 10 分鍾):
SET sys.TimeToLive = '00:10:00'; SET EnqueuedTimeUtc = sys.EnqueuedTimeUtc; SET ScheduledEnqueueTimeUtc = sys.ExpiresAtUtc; SET sys.ScheduledEnqueueTimeUtc = sys.ExpiresAtUtc; SET sys.Label = 'Delay'; SET sys.TimeToLive = '01:00:00';
目的地隊列:
EnableDeadLetteringOnMessageExpiration = true
根據上面的設置,隊列中的調度消息必須在'01:00:00'等TTL內消費,否則消息發送到DLQ。 Sean 的評論中有更多詳細信息。
使用ServiceBusTrigger函數,可以像AEG訂閱者一樣透明地從隊列中拉出延遲事件消息。
在這種情況下,當延遲事件被發送回 AEG 以進行扇出分發並使用推送和推送模式時,以下示例顯示了 ServiceBusTrigger 的此實現,其中輸出綁定到 AEG 自定義主題:
運行.csx:
#r "Newtonsoft.Json"
#r "Microsoft.Azure.EventGrid"
#r "Microsoft.Azure.ServiceBus"
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Azure.ServiceBus;
public static async Task Run(Message queueItem, IAsyncCollector<EventGridEvent> outputEvents, ILogger log)
{
string jsontext = JToken.Parse(Encoding.UTF8.GetString(queueItem.Body)).ToString(Formatting.Indented);
log.LogInformation(jsontext);
EventGridEvent eventGridEvent = JsonConvert.DeserializeObject<EventGridEvent>(jsontext);
eventGridEvent.Topic = null;
eventGridEvent.Subject += "/delayed";
await outputEvents.AddAsync(eventGridEvent);
await Task.CompletedTask;
}
函數.json:
{
"bindings": [
{
"name": "queueItem",
"type": "serviceBusTrigger",
"direction": "in",
"queueName": "aeg",
"connection": "rk2016_SERVICEBUS"
},
{
"type": "eventGrid",
"direction": "out",
"name": "outputEvents",
"topicEndpointUri": "AEG_TOPIC_XX_ENDPOINT",
"topicKeySetting": "AEG_TOPIC_XX_KEY"
}
]
}
如您所見,主題屬性已修改后綴/delayed用於過濾目的,例如避免循環等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.