2017-08-08 50 views
6

我想與卡夫卡一起深入處理流處理,我需要一些幫助,讓我的頭部圍繞一些目前不太清楚的設計原則。卡夫卡流應用程序設計負責人

1.)假設我有一些實時股價數據。你是否會用股票代碼來鎖定(並因此分割)一個主題「價格」?或者你會爲每個符號製作一個主題?例如,如果我決定生產(添加)一些更多的股票代碼,包括以後的完整歷史記錄,會發生什麼情況?現在我的歷史(在日誌中訂購)的主題「價格」是一團糟,對吧?另一方面,對於每個價格系列,我想要稍後計算回報,如果它們在不同的主題上,我必須跟蹤它們併爲每個符號開始新的流應用程序。

2.)現在有不同的實時價格,我需要加入一個任意數量的一個大的記錄。在例子中將所有sp500符號連接成一條記錄。因爲我在同一時間沒有所有sp500符號的價格,但可能非常接近。如果在這個確切的時間裏失蹤,我怎樣才能使用最新的價格加入他們?

3.)說我已經解決了加入用例,我將所有sp500股票的加入記錄抽回卡夫卡。如果我犯了一個錯誤,並且我忘記了一個符號,我該怎麼做?顯然,我想將它添加到流中。現在我需要鞭撻「sp500」日誌並重建它的權利?或者是否有一些機制將起始偏移重置爲特定的偏移量(我已修復連接的偏移量)?也很可能我有其他流應用程序正在從這個主題消費。他們還需要做某種重置/重放。是不是存儲sp500主題可能是一個更好的主意,但將其作爲長流程的一部分?但是我最終會多次進行同一個連接。

4)也許這應該是1,因爲這是我的目標^^部分 - 但是,我怎麼能像建模這樣的數據流:

produce prices -> calculate returns -> join several returns into a row vector -> calculate covariance (window of rowvectors) -> join covariance with returns 
                       ->            -> into a tuple (ret, cov) 

我甚至不知道,如果這樣的使用今天的流處理可能會出現複雜的用例。

回答

1

當使用Kafka時,我將這些消息看作鍵/值對,存儲在分佈式,持久化和複製的主題中,作爲無盡的數據流發送。該主題可以針對不同的保留時間和保留/(清除)方法進行配置。

1)你如何組織你的主題取決於你。你基本上都可以做,並且取決於你想要如何使用這些數據,以後兩者都可能會有所幫助。在你的用例中,我會將價格寫入一個主題。關鍵字應該像關係數據庫中的主鍵一樣選中。它保證了每個鍵發送的值的順序,也可能用於保留。順便說一句:你可以在一個應用程序中使用多個流/主題。

2)你想在這裏使用的是所謂的「表/流二元性」。 (注意:我認爲流式數據是無狀態的,表格是statefull。)因此,從技術上講,您可以從鍵構建映射(例如在內存中)到值(流中此鍵的最新值)。 Kafka Streams將爲您提供KTable。卡夫卡本身也可以爲您使用一個附加主題,其中保留配置爲僅保留密鑰的最新值。 一些不錯的鏈接:

3)卡夫卡主題中的信息均基於您的保留配置存儲。所以你可以配置它存儲所有數據7天。如果您想稍後添加數據,但使用其他時間,則其生成時間您需要將時間作爲消息數據的一部分發送,並在稍後處理時使用該時間。對於每個消費者,您可以設置/重置應該開始閱讀的偏移量。這意味着您可以返回並重新處理仍在您的主題中的所有數據。

4)我不確定你在問什麼,因爲你的流量接縫對你的目標來說很好。卡夫卡和流處理是您的使用案例的完美搭配。

一般而言,我可以推薦閱讀Confluent博客,Confluent文檔以及Kafka網站上的所有內容。很多問題都取決於你的要求,硬件以及你想要在軟件中做什麼,所以即使在給定的信息中,我需要說「它取決於」。我希望這可以幫助你和其他人開始與卡夫卡,即使它只是一個快速嘗試解釋的概念,並給出一些鏈接作爲出發點。