簡體   English   中英

快處理主題和慢處理主題 - Akka Kafka

[英]Fast Processing Topic and Slow Processing Topic - Akka Kafka

我有一個問題,我需要優先處理一些事件,以便更早處理一些事件,比如在高優先級事件之后。 這些事件來自一個來源,我需要根據事件類型優先級對流進行優先級排序,以便在高優先級或低優先級接收器中轉發。 我正在使用 kafka 和 akka kafka 流。 所以主要問題是我在給定的時間點獲得大量流量。 這里的首選方案是什么?

首先要解決的是偏移提交。 因為處理不會按順序進行,處理后commit offsets不能保證at-least-once(也不能保證at-most-once),因為下面的順序是可能的(而且這個概率不能降為零):

  • 在處理多個低優先級消息之前處理的高優先級消息的提交偏移量
  • Stream 失敗(或運行 stream 的實例停止,或其他)
  • Stream 從上次提交的偏移量重新開始
  • 低優先級的消息再也不會從 Kafka 讀取,所以永遠不會被處理

這表明要么偏移量提交必須在重新排序之前發生,要么我們需要一個已處理但尚未提交的概念,直到處理完低優先級消息。 請注意,對於后一種選擇,跟蹤未提交的最大偏移量(可能有效的最簡單策略)將不起作用,如果有任何可能在偏移序列中產生間隙這意味着無限保留和不壓縮,我實際上建議提交處理前的偏移量,但是一旦處理邏輯保證它最終會處理消息。

演員和 Akka 持久性的組合允許采用這種方法。 粗略的概述是擁有一個持久的參與者(這非常適合事件溯源)並且基本上維護要處理的高優先級和低優先級消息列表。 stream 從 Kafka 向 actor 發送帶有消息的“詢問”,actor 在收到消息時將消息分類為高/低優先級,假設該消息尚未被處理。 消息(可能還有它的分類)作為事件持久化,參與者確認收到消息,並承諾通過為自己安排消息來完全處理“待處理”消息來處理它。 確認完成請求,允許將偏移量提交給 Kafka。 在收到消息(實際上是命令)以處理消息時,參與者選擇要處理的 Kafka 消息(按優先級、年齡等)並堅持認為它已處理該消息(因此將其從“待處理”中移出到“已處理”)並且可能還會持續更新與它如何解釋 Kafka 消息相關的事件更新 state。 在這種持久化之后,actor 向自己發送另一個命令來處理“to-process”消息。

然后,通過讓后台進程使用“處理一條到進程的消息”命令定期對該參與者執行 ping 操作,可以實現容錯。

與 stream 一樣,這是一個每個分區的單個邏輯線程進程。 您可能正在為每個物理 Kafka 分區多路復用價值 state 的許多分區,在這種情況下,您可以擁有多個這樣的參與者並從攝取 stream 發送多個請求。如果這樣做,周期性 ping 可能最好由 stream fed 完成通過 Akka 持久性查詢來獲取所有持久性參與者的標識符。

請注意,此問題中的重新排序從根本上使它成為一場競賽,因此是不確定的:在此設計草圖中,競賽是因為對於來自演員 B 的消息 M1 和來自演員 C 的消息 M2 發送給演員 A 可能以任何順序接收(如果actor B 在發送消息 M1 后向 actor A 發送消息 M3,M3 將在 M1 之后到達,但可以在 M2 之前或之后到達)。 在不同的設計中,競爭可能基於相對於 Kafka 使消息可供消費的延遲的處理速度。

暫無
暫無

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

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