[英]Best practice for Apache Flink for user defined alerts
假設我的 Flink 工作收到了 stream 的股票價格(例如),如果假設股票跌至某個價格以下,則會發出警報。 用戶可以添加或刪除這些警報條件。 例如,用戶abc@somemail.com
創建了一條規則,以便在GME
價格跌至 100 美元以下時發出警報。 我的 Flink 作業如何以可擴展的方式動態跟蹤所有這些警報條件?
我可以創建一個 API,我的 Flink 工作可以調用它來獲取所有更新的警報標准,但這意味着要多次調用 API 以使所有內容保持最新。
或者我可以使用 Flink Table API 創建一個永久表,一旦用戶創建新的警報條件,另一個 Flink 作業就會更新。
這個用例的最佳實踐是什么?
筆記:
這是純粹流式方法的設計草圖:
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.