[英]How to look up and update the state of a record from a database in Apache Flink?
我正在研究數據流應用程序,我正在調查使用Apache Flink進行此項目的可能性。 主要原因是它支持漂亮的高級流構造,非常類似於Java 8的Stream API。
我將接收與數據庫中的特定記錄相對應的事件,並且我希望能夠處理這些事件(來自諸如RabbitMQ或Kafka之類的消息代理)並最終更新數據庫中的記錄並推送已處理的/將事件轉換為另一個接收器(可能是另一個消息代理)
理想情況下,與特定記錄相關的事件需要以FIFO順序進行處理(盡管會有一個時間戳有助於檢測無序事件),但可以並行處理與不同記錄相關的事件。 我打算使用keyBy()
構造來按記錄分區流。
需要完成的處理取決於數據庫中有關記錄的當前信息。 但是,我無法找到一個示例或建議的方法來查詢數據庫以獲取此類記錄,以使用我需要處理它的其他信息來豐富正在處理的事件。
我想到的管道如下:
- > keyBy()對接收到的id - >從數據庫中檢索對應id的記錄 - >對記錄執行處理步驟 - >將處理后的事件推送到外部隊列並更新數據庫記錄
需要更新數據庫記錄,因為另一個應用程序將查詢數據。
在實現此管道之后,可能會有額外的優化措施。 例如,可以將(更新的)記錄緩存在托管狀態,以便同一記錄上的下一個事件不需要另一個數據庫查詢。 但是,如果應用程序不知道特定記錄,則需要從數據庫中檢索它。
Apache Flink中用於此類場景的最佳方法是什么?
您可以通過擴展RichFlatMap
函數的豐富函數來執行數據庫查找,在open()
方法中初始化數據庫連接一次,然后在flatMap()
方法中處理每個事件:
public static class DatabaseMapper extends RichFlatMapFunction<Event, EncrichedEvent> {
// Declare DB coonection and query statements
@Override
public void open(Configuration parameters) throws Exception {
// Initialize Database connection
// Prepare Query statements
}
@Override
public void flatMap(Event currentEvent, Collector<EncrichedEvent> out) throws Exception {
// look up the Database, update record, enrich event
out.collect(enrichedEvent);
}
})
然后您可以使用DatabaseMapper
,如下所示:
stream.keyby(id)
.flatmap(new DatabaseMapper())
.addSink(..);
您可以在這里找到使用Redis緩存數據的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.