我們設計的分布式系統,在正常工作時呈現出網狀。服務有層次性。客戶的請求會逐步經歷各層服務進行處理。當遍歷全然部服務後才會完畢一次請求。每層服務會有若干臺機器。上游節點的機器能夠把輸出結果傳遞到下游節點的隨意一台機器上。
當服務所依賴的資料須要更新時。我們須要做好同步工作,並保證在資料更新過程中服務是可用的。這兒介紹兩類更新的操作方式,它們都須要用到zookeeper來實現。
第一類更新僅僅侷限於乙個服務的全部機器。我們須要給它們的更新設定乙個順序,避免出現該服務全部機器同一時候更新這樣的極端情況。zookeeper鼓舞使用非同步的api進行程式設計,在實現過程中至少有兩種方式來實現這樣的分布式鎖。第一種是試圖去建立乙個既定的結點。假設成功則表示鎖已經拿到,能夠開始更新,否則建立觀察點。等待別的機器完畢更新後釋放這個鎖(當然仍然可能拿不到);另外一種則去建立乙個順序節點(sequence),zookeeper能保證建立節點的唯一性,然後服務僅僅須要監控順序在自己之前的節點是否完畢了更新(釋放鎖)。當資料量不大時。兩種實現方式的效能應該區別不大。資料量大時推薦使用另外一種方式,由於它能夠減少通知時產生的網路流量。第一種方式在搶鎖過程中,網路更快的機器更easy搶到,另外一種方式是基於排隊機制的。
儘管邏輯簡單,但實際程式設計過程中還是會比較麻煩,須要考慮網路傳輸等問題等。
第二類更新是多個服務中有資料依賴的情況。
比方服務a和b,它們均有兩台機器a1, a2, b1, b2。初始時的資料時間戳同樣。即服務a的資料是da_t1, 服務b的資料是db_t1。
假設我們有了新的資料da_t2和db_t2,我們僅僅同意首先同一時候更新a和b的當中一台機器。如a1, b1;這是更新資料後的server也僅僅會把自己的下游資料傳送到已經更新資料的下游server中去,即由原先的a1和a2都能夠把下游資料傳送給b1和b2的隨意一台。如今a1僅僅能給b1,a2僅僅能給b2。直到a2, b2均更新為新資料的時候。才幹恢復原先的傳輸方式。
詳細的實施方式是首先我們須要知道整個資料更新的總server的情況, 以資料的名來命名(index)。例如以下: /data/index/a/a1, /data/index/a/a2, /data/index/b/b1,/data/index/b/b2, 一旦時間戳為t2的資料報都準備好了,那麼改動節點/data/index的值為t2(能夠一級一級的更新,即/data/index/a。 /data/index/b的時間戳都改動為t2後。再改動/data/index),而且選取每類服務的若干機器開始更新,即新增/updating/index/a/a1, /updating/index/b/b1。並賦值為t2。
每台server會監控自己所屬的結點,即a1會監控/updating/index/a/a1。一旦發現該節點出現,就開始進行資料更新,更新完畢後會刪除自己的所屬節點。監控服務一旦發現/updating/index/a/a1, /updating/index/b/b1均被刪除了。就會又一次賦值/updating/index/a/a2,/updating/index/b/b2。
當時間戳為t2的全部資料均完畢更新後,對/updated/index進行賦值為t2。可是在實際程式設計過程中,全然依照上面的描寫敘述進行會很的麻煩。所以我們還是進行了簡化。但其邏輯還是得以保證。
至此,對於我設計的分布式框架系統已經介紹完成。
一種分布式框架設計(二)
本篇主要介紹分布式框架的模組和其主要使用的通訊方式zmq。首先,對於任意的上游結點,它都有可能會把處理的結果傳送到任意的一台下游結點中,同時如果下游結點有新增的結點,上游結點還能自動感知並處理。另一方面,任意的下游結點也會要和所有的上游結點保持心跳。如果使用原始的socket,解決上述的問題會比較麻...
分布式服務框架設計指標
特性名 功能名說明 服務訂閱發布 配置化發布和引用服務 支援通過xml配置的方式發布和匯入服務 服務自動發現機制 支援服務實時自動發現,由註冊中心推送服務提供者位址,消費者不需要配置服務提供者位址,位址透明化 支援執行態註冊和取消服務 服務路由 預設提供隨機路由 輪詢 基於權重的策略等 粘滯連線 總...
分布式框架設計中的服務降級
另外一些場景就是某些服務不可用時,又不能直接讓整個流程失敗就本地mcok 模擬 實現,做流程放通 eg 使用者登入餘額鑑權服務不能正常工作,需要做業務放通,記錄消費話單允許使用者繼續訪問,而不是返回失敗 為了保證以上兩種場景的正常服務,服務需要有降級 服務降級主要包括容錯降級和遮蔽降級 遮蔽降級 1...