我是新來流處理(kafka流/ flink /風暴/火花/等),並試圖找出處理現實世界問題的最佳方法,代表這裏以玩具爲例。我們與Kafka綁定用於我們的pubsub/data攝入,但對流處理器框架/方法沒有特別的依賴。流處理架構:未來事件影響過去的結果
理論上,假設我有一個零星發射浮點值的源。在任何給定的點上都有一個乘數M應該應用於這個源的值;但是M可以改變,而且批判地說,我可能只在晚些時候纔會發現這種變化 - 甚至可能不是「按照變化順序」。
我想到卡夫卡表示此爲
"Values": (timestamp, floating point value) - the values from the source, tagged with their emission time.
"Multipliers": (timestamp, floating point multiplier) - indicates M changed to this floating point multiplier at this timestamp.
然後,我會很想創建一個輸出話題,說:「結果」,使用標準的流處理架構,連接兩個流,並只需將值中的每個值乘以由乘子確定的當前乘數。
但是,根據我的理解,這不會起作用,因爲發佈到乘法器的新事件可能會對已寫入結果流的結果產生任意大的影響。從概念上講,我希望能得到類似於結果流的結果流,該結果流是發佈到乘法器的最後一個事件針對值中的所有值發佈的,但可以作爲其他值或乘法器事件進行「重新計算」。
用kafka和主流處理器來實現/構建這些技術有哪些?
例子:
最初,
Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
Multipliers = [(1, 1.0)]
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
後來,
Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
Multipliers = [(1, 1.0), (4, 2.0)]
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 4.4)]
最後,在另一個事件發佈到乘法器(也是一個新值發出過):
Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2), (7, 5.0)]
Multipliers = [(1, 1.0), (4, 2.0), (2, 3.0)]
Results = [(1, 2.4), (2, 10.8), (3, 3.0), (5, 4.4), (7, 10.0)]
恕我直言,這是相當廣泛的給你一個具體的答案。實際的解決方案將取決於要求:「我們需要怎樣處理數據」。在提供的示例中,我將存儲這兩個流並在讀取時執行操作:即。當需要結果時。但是根據實際情況中的應用需求,這可能還不夠。 – maasg
在此程序中,乘數乘以按鍵的值。 所以你的結果會受到影響。 –
好點maasg。在我們的例子中,有太多的數據流入來支持推遲計算。另外,我們需要做一些查詢,比如「給我所有的結果值和它們的時間戳,其值在X和Y之間,就你所知,根據目前關於乘數的信息」;如果沒有計算它們,就不能對該查詢的結果編制索引。 – jdowdell