- 原文地址:Joining Data Streams
- 原文做者:Jakob Jenkov
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:whatbeg
- 校對者:xionglong58, Fengziyin1234
鏈接數據流意味着將一個數據流的消息與另外一個數據流的消息鏈接起來,這一般基於這些消息中的關鍵字。一旦開始鏈接數據流,它將牽扯到如何處理流以及如何擴展流的方式。鏈接數據流還會影響到鏈接過程當中存儲消息所需的存儲空間大小。html
鏈接流的基本概念指的是你從多個流中讀取消息並將這些消息鏈接在一塊兒。例如,假設你有一個數據流包含客戶更新的更新事件,另外一個流包含客戶合同的更新事件。當你收到客戶的更新時,你可能但願查找客戶的全部聯繫人並對其執行某些操做。例如,你能夠將合同附加到客戶對象,並將附加後的客戶對象轉發到另外一個數據流。或者,假設客戶的婚姻情況從已婚變爲單身,你可能會想檢查他們的合同是否應該作相應的更改。前端
當鏈接流時,彼此相關的不一樣流中的消息一般由一組關鍵字標識。例如,客戶具備客戶 ID,合同具備合同 ID 以及合同所屬的客戶 ID(外鍵)。要將特定客戶對象與其相關的合同對象鏈接起來,你能夠在合同流中查找合同對象,確保這個合同對象有一個客戶的 ID 對應所查詢的客戶的客戶 ID。android
當處理數據流時,你是一次處理一條消息或記錄。你無權訪問該數據流中的任何先前的記錄,一樣也沒法訪問任何未來的記錄。所以,爲了可以從另外一個流中定位記錄,該流的消息必須存儲在某種數據視圖中。ios
數據視圖有兩種常見的變體:git
一個數據窗口保存了一個能夠在其中查找記錄的記錄視窗。數據窗口一般受時間,記錄數量和其餘存儲約束的限制。當預計兩個流中的記錄在到達時間上彼此接近時,時間一般被用來限制窗口。而後,一個流中的記錄能夠存儲在一個窗口中,例如 5 分鐘或 30 分鐘(或適合實際用例的任什麼時候間窗口),直到其餘數據流中的記錄到達。github
一個數據表將記錄保存在表格型數據結構中。這樣的數據結構能夠是簡單的關鍵字,記錄的映射,這裏,記錄能夠經過其關鍵字來查找。記錄也能夠存儲在其餘地方,如數據庫表,以即可以經過主鍵,外鍵和其餘值找到記錄。數據庫
數據窗口和表格能夠組合。數據表中能夠僅存放記錄窗口的數據。當記錄「太舊」而不在窗口中時,它也將會從新從數據表中被刪除。後端
還能夠對數據流或數據窗口中的記錄使用其餘數據結構(如樹或圖)來構建數據視圖。這一切都取決於你的需求。數據結構
有時,你可能但願從一個數據流中轉發記錄,而該數據流已與另外一個數據流中的記錄進行了鏈接。這裏的轉發指的是將鏈接後的記錄寫入另外一個數據流,供其餘人使用。這裏的鏈接指的是要麼將一條記錄插入另外一條記錄,要麼建立一條包含兩條記錄的鏈接信息的新記錄。這兩個選項都在下圖說明:性能
一旦你轉發鏈接後的記錄,會有一些問題影響到系統的正確性和性能。我將在如下部分介紹這些問題。
輸入數據流中記錄到達的時序會影響處理或轉發時鏈接後記錄的樣子。下圖說明了時序的差別如何影響兩個輸入記錄的鏈接記錄:
記錄 A 和 B 各自被更新 2 次。這兩個版本標註爲 A1,A2,B1 和 B2,其中數字表明記錄的版本。請注意,A1,A2,B1 和 B2 的到達時間是如何影響處理或轉發時鏈接記錄的外觀的。該圖顯示了 3 種不一樣的時序排列,而且在每種狀況下鏈接的結果看起來都不一樣。
注意,即便最終鏈接後的記錄看起來相同,獲得最終記錄的鏈接記錄也不會相同。另外,請記住,你永遠不知道「最終」記錄什麼時候被鏈接。沒有任何辦法能夠知道輸入數據流中未來會發生什麼。所以,你不能只查看上面示例中的最後一條記錄,就得出數據流中這些記錄的鏈接操做的「最終」結果。「最終」結果是全部中間突變中鏈接記錄的完整序列。
若是你的數據流是水平擴展的(scale out),則鏈接記錄將更加困難。在本節中,我將嘗試向你解釋爲何會這樣。
如本教程以前所述,鏈接的記錄一般由其鍵匹配。例如,一個 Customer 記錄可能使用 customerId 做爲主鍵,而一個 Contract 記錄可能具備引用 Customer 記錄的主鍵 customerId 的外鍵 customerIdFk。
當水平擴展數據流時,數據流中的記錄在不一樣的計算機上進行分區。要鏈接兩條記錄,要麼將記錄分區到同一臺計算機上,要麼你的鏈接操做必須知道如何查找存儲在另外一臺計算機上的記錄。這兩個選項將在如下各節作更詳細的介紹。
若是你的鏈接操做不知道如何查找存儲在另外一臺計算機上的記錄,則必須對要鏈接的記錄進行分區,以便要鏈接的記錄都位於同一臺計算機上。若是此分區不是記錄的天然分區,則必須從新分區其中一個數據流中的記錄,以便將須要鏈接的記錄放置在同一計算機上。
注意,記錄的從新分區會下降完整記錄處理鏈(也就是圖或拓撲)的性能。從新分區還會建立被從新分區的記錄的額外副本。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。