簡體   English   中英

如何推遲事件觸發/接收

[英]How to postponed event trigger/receive

SUM:如何在 azure 事件網格中推遲事件觸發或事件接收?

我設計的系統需要對低頻 OBJECT 狀態(創建、啟動、檢查長時間處於啟動狀態、結束)做出反應。 它看起來像是事件處理的候選者。 我想用 azure 函數來實現它......問題是我需要對處於 STARTED 狀態的 10 分鍾(可配置)的 OBJECT 做出反應。 在事件發生后 10 分鍾做出反應。 如何延遲事件觸發? 如何安排事件火? 如何等待事件? 我正在尋找不會消耗我的付費資源(函數處理時間)的解決方案。 知道如何解決這個 posponing 嗎? 謝謝你。

功能一:

  • 時間觸發(輪詢)
  • 檢查條件
    • 可以創建對象創建的事件

功能二:

  • http 觸發
  • 用戶從 UI 啟動 OBJECT
    • 創建 OBJECT-started 事件但在 10 分鍾后觸發它? (在函數代碼中睡眠/定時器會消耗資源 10 分鍾,並以過高的成本結束)

功能3:???

  • ???
  • 檢查狀態並檢測 10 分鍾延遲
    • 觸發 OBJECT-10 分鍾開始的事件

...

在事件發生后 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM