簡體   English   中英

Azure Service Bus中是否有緩沖相關消息進行批處理的模式?

[英]Is there a pattern for buffering related messages in Azure Service Bus for batch processing?

我正在構建一個解決方案,該解決方案根據放置在 Azure 服務總線隊列中的消息處理對記錄的更改。 該隊列包含一個交錯的消息序列,用於更改多個不同的記錄,並且每個消息都會觸發 Azure Function 以處理更改並將它們存儲在后端服務中。 更改隊列中的每條消息都與一條記錄相關,並包含一個屬性: recordId

問題是,使用每條消息調用后端服務會產生一些開銷,而且多條消息經常快速連續地出現在單個記錄的隊列中。 我想允許對每條記錄的“緩沖區”進行多次更改,以便后端服務可以不那么頻繁地被調用,但有一批更改。

我正在考慮使用服務總線的會話功能和 Azure Function 監視更改隊列,然后使用recordId作為 Session 名稱將每條消息轉發到 Session 隊列。 理想情況下,我希望 Messages 在 Session 隊列中緩沖,直到:

  1. recordId有一段安靜的時間(例如 10 秒內沒有變化)
  2. 或者,達到了 Session 大小的限制(例如,對記錄進行了 30 次更改)

問題是:如何根據這些場景觸發每個session的處理? 我已經研究過使用計划消息來處理第一種情況,但隨后我需要一種可靠的重新計划方式來創建滑動超時。 同樣,除了在某處存儲一個計數器之外,似乎也沒有監控 session 大小的好方法。

我正在嘗試純粹使用服務總線和函數來解決問題,盡管我對任何其他想法都持開放態度。

您想要實現的目標與服務意圖和功能之間存在不匹配。 讓我們先來看看會話。

會話打算按照消息發送的順序處理消息。 這是 Azure 服務總線的一種方式,可以在您通常獲得的無序隊列之上為您提供一個 FIFO 隊列,並消除競爭消費者處理消息的機會,從而導致亂序處理。 Session 條消息從隊列中“耗盡”,在最后一條消息被消費后,在配置的 session 超時后,session 的消費者將繼續使用下一個可用的 session。

計划的消息是在未來發送以延遲其處理的消息。 調度是基於每條消息完成的,不能應用於諸如 session 之類的組。您當然可以將調度編排為大致相同的時間,但這會很棘手 - 當您知道何時安排第一條消息時還沒有收到最后一個呢。

使用 function 批量接收是一種請求最多一批消息的方法,並不意味着您將獲得該確切數量。 如果session 的所有消息都在隊列中,那么會話和批量接收的組合可能會起作用。 雖然您可能不會在一次 function 執行中處理與給定 session 關聯的所有消息,但您仍然會以較低的頻率和順序處理這些消息的發送順序。

總而言之,您可以通過將IsBatchedIsSessionsEnabled設置為true來減少 function 調用的數量,並讓消息按發送時的相同順序分批傳送以進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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