我正在重構一個分析系統,該系統將進行大量計算,並且我需要關於可能的體系結構設計的一些想法來解決我面臨的數據一致性問題。分佈式分析系統上數據一致性的體系結構設計
當前的架構
我有一個隊列爲基礎的系統,在不同的請求應用程序創建最終由工人使用的消息。
每個「請求應用」分解大的計算成小塊將由工人被髮送到隊列和處理。
當所有作品完成時,原始「請求應用程序」將合併結果。
此外,工人爲了處理請求消耗從集中式數據庫(SQL Server)的信息(重要:工人不改變數據庫的任何數據,只有使用它)。
問題
確定。到現在爲止還挺好。當我們包含更新數據庫信息的Web服務時,會出現問題。這可能隨時發生,但每個來自同一個「請求應用程序」的「大型計算」在數據庫中看到相同的數據是至關重要的。
例如:
- 應用甲生成消息A1和A2,將其發送到隊列
- 工人W1用於處理拾取消息A1。
- Web服務器更新數據庫,從狀態S0更改爲S1。
- 工人W2拿起消息A2進行處理
我只是不容使用數據庫的狀態S1有工人W2。爲了使整個計算一致,它應該使用先前的S0狀態。
思考
一個鎖模式防止Web服務器更改數據庫,同時還有與它有工人消費的信息。
- 缺點:鎖可能在很長一段時間,由於在計算形式不同的 「請求的應用」 可能會重疊(A1,B1,A2,B2,C1,B3,等)。
創建數據庫和工作人員(即控制由REQ數據庫緩存應用程序服務器)之間新層
- 利弊:添加另一層可能會強加顯著開銷(也許? ),而且這是很多工作,因爲我將不得不重寫工人的持久性(很多代碼)。
我未決的第二個解決方案,但它不是很有信心。
任何精彩的想法?我設計錯了,還是錯過了一些東西?
OBS:
- 這是一個巨大的2層遺留系統(在C#),我們試圖 演變成與作爲最小的努力更具擴展性的解決方案 可能。
- 每個工作人員可能在不同的服務器上運行。
聽起來非常像地圖/減少我。你爲什麼要自己寫這樣的東西?我只是使用Hadoop。 – duffymo
我忘了提及這是一個巨大的2層遺留系統(使用C#),我們試圖用盡可能少的努力發展成爲一個更具擴展性的解決方案。我相信把一切都變成哈多普將是一項艱鉅的任務。 –
比編寫,調試和維護Hadoop已經做的更多的工作?我承諾在提交之前。 – duffymo