簡體   English   中英

Apache Flink 用戶定義警報的最佳實踐

[英]Best practice for Apache Flink for user defined alerts

假設我的 Flink 工作收到了 stream 的股票價格(例如),如果假設股票跌至某個價格以下,則會發出警報。 用戶可以添加或刪除這些警報條件。 例如,用戶abc@somemail.com創建了一條規則,以便在GME價格跌至 100 美元以下時發出警報。 我的 Flink 作業如何以可擴展的方式動態跟蹤所有這些警報條件?

我可以創建一個 API,我的 Flink 工作可以調用它來獲取所有更新的警報標准,但這意味着要多次調用 API 以使所有內容保持最新。

或者我可以使用 Flink Table API 創建一個永久表,一旦用戶創建新的警報條件,另一個 Flink 作業就會更新。

這個用例的最佳實踐是什么?

筆記:

  1. 應以最小的延遲發出警報
  2. 警報標准應在用戶創建后立即更新。

這是純粹流式方法的設計草圖:

alertUpdates = alerts
  .keyBy(user)
  .process(managePreviousAlerts)  // uses MapState<Stock, Price>
  .keyBy(stock, price)

priceUpdates = prices
  .keyBy(stock)
  .process(managePriceHistory)
  .keyBy(stock, price)

alertUpdates
  .connect(priceUpdates)
  .process(manageAlertsAndPrices) // uses MapState<User, Boolean>
  • managePreviousAlerts維護來自股票的每個用戶MapState以提醒價格。 當新警報到達時,找到該股票(針對該用戶)的現有警報(如果有)。 然后發出兩個AlertUpdates :針對此(用戶、股票、舊警報價格)的RemoveAlert事件和針對此(用戶、股票、新警報價格)的AddAlert事件。
  • managePriceHistory在 state 中保留一些每只股票的定價歷史記錄,並使用一些業務邏輯來確定傳入的價格是否是值得觸發警報的更改。 (例如,也許您只在價格下跌時才發出警報。)
  • manageAlertsAndPrices維護一個按股票、按價格的MapState ,由用戶鍵入。
    • 這個MapState的鍵是所有在這個價格下對該股票有警報的用戶。 收到PriceUpdate后,通過遍歷MapState的鍵來提醒所有這些用戶。
    • 收到RemoveAlert后,將用戶從MapState中刪除。
    • 收到AddAlert后,將用戶添加到MapState

這應該可以很好地擴展。 延遲將由 keyBys 引起的兩次網絡洗牌控制。

我認為這取決於您通常如何處理生成警報。 我的第一個想法是使用 Kafka 來存儲新警報,以便 Flink 可以將它們作為 Stream 接收。 然后,根據要求,您可以簡單地broadcast stream 警報connect其與股票價格 stream 連接。 這應該可以讓你很好地擴展。

但是如果您使用的是表 API,那么使用外部表來存儲數據可能也是一個好主意,那么您可以看看類似的東西

暫無
暫無

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

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