您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何理解C#.NET分布式鎖服務,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
背 景
分布式鎖服務在大家的項目中或許用的不多,因為大家都把排他放在數據庫那一層來擋。當大量的行鎖、表鎖、事務充斥著數據庫的時候,不如換個角度思考問題。一般web應用很多的瓶頸都在數據庫上,這里給大家介紹的是減輕數據庫鎖負擔的一種方案。
簡 介
如果我們的需求很簡單,例如對于用戶的賬戶資金,要保證原子性操作。并且不同的客戶端在同一時間內只能提交一個對象操作。lock、單例?!在單臺上還可以,但是大型web項目上,負載均衡是常用的技術手段手段,同一意義的對象可能存在不同的副本,這時我們又如何保證排他操作。數據庫的事務!除了這個,接下來我們引出本章的主題、分布式鎖服務。
一個簡單的鎖服務實現起來并不難,甚至利用memcache很快就能構造一套分布式鎖系統。我們只需要在操作對象時寫入kv鍵值對,操作完畢時釋放kv,在讀取對象時判斷kv中是否有數據就可以了,我們甚至還可以給它一個默認的釋放時間。
這是一種解決方案,但是如果我們的要求更高一點,我們需要權限認證(例如只能來自xxx域名的請求)、需要上下級節點關聯(例如一個用戶的資金賬戶被鎖住,同時鎖住他的購物車、積分等)、需要監視器回調、甚至需要考慮單點故障問題。那么,蟲子在這里推薦另一套方案----zookeeper。
Zookeeper是Hadoop中的一個模塊。是一個分布式的,開源的分布式應用程序協調服務,用它可以來現同步服務,配置維護。
更多的內容大家看文檔吧或者直接網上搜一下,理論性的內容寫多了讓人困。我們直接看實踐。
性能篇
服務器ubuntu (虛擬機一臺)
客戶端window2003
服務端安裝好java環境 然后跟著官方的介紹部署
啟動zkserver
我們測試下鎖服務相關的操作
ps:試下本機的windows2003 因為是本地環境 不于上面做對比 僅看看zookeeper本身的數據處理效率
功能篇
一張圖就可以介紹完普通功能
再看下watcher
public class MyWatch : IWatcher { public void Process(WatchedEvent qevent) { Console.WriteLine("this is MyWatch"); } } public class MyWatch3 : IWatcher { public void Process(WatchedEvent qevent) { Console.WriteLine("this is MyWatch3"); } }
創建連接時 new ZooKeeper("192.168.206.129:2181", new TimeSpan(0, 0, 0, 4000), new MyWatch());
檢查是否存在時zk.Exists(Dir, new MyWatch3());
獲取數據時zk.GetData(Dir, new MyWatch3(), stat);
我們再運行一遍之前的demo 去掉delete操作
加上delete操作
淺 析
創建連接:
獲取服務主機列表
設置超時時間
注冊客戶端事件
以線程安全的方式創建請求連接(啟動客戶端請求隊列,循環隊列基于socket通信、根據請求類型執行不同的請求動作)
請求流程:
構造請求頭、構造request,reponse、構造響應頭、構造Packet對象,packet對象準備好后,把整個對象放入一個outgoingQueue
packet被放入outgoingQueue中,等待SendThread把packet對應的內容發送給server。server處理分3步在 doio方法中ReadLength ReadConnectResult ReadResponse,直到ReadResponse方法中確定packet請求結束。
響應流程:
針對心跳的ping請求的resp,針對auth請求的resp,一般接口請求的resp,如果接口請求要求了watcher,當watcher關注的內容有變化時的notification
鎖相關部分API方法:
創建節點:create
demo:zk.Create(Dir, severname.GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);
其中CreateMode分為4類Persistent、PersistentSequential、Ephemeral、EphemeralSequential
PERSISTENT 創建持久化節點,對應機器關閉連接后節點/數據不會消失
PERSISTENT_SEQUENTIAL 如果PATH是以’/’結尾則以這個PATH作為父節點,創建一個子節點,其子節點名字是一個按先后順序排列的數值;否則創建一個名字是‘/’后面字符加上先后順序排列的數值字符串的節點,同樣創建持久節點
EPHEMERAL 創建瞬時節點,Zookeeper在感知連接機器宕機后會清除它創建的瞬時節點
EPHEMERAL_SEQUENTIAL 穿件瞬時順序節點,和PERSISTENT_SEQUENTIAL一樣,區別在于它是瞬時的
刪除節點 delete
demo :zk.Delete(Dir, -1);
前一個參數代表節點名稱(一般用作路徑),后一個是版本號 -1表示全匹配
查看節點 exists
demo : zk.Exists(Dir, new MyWatch3());
獲取數據 getData
demo :zk.GetData(Dir, new MyWatch3(), stat);
獲取一個節點的數據,可注入watcher
設置數據 setData
demo : zk.SetData(Dir, new byte[1], 1);
獲取下級節點集合 GetChildren
demo :zk.GetChildren(Dir, true);
存 儲
znodes類似文件和目錄。但它不是一個典型的文件系統,zookeeper數據保存在內存中,這意味著zookeeper可以實現高吞吐量和低延遲。
watcher
Zookeeper有兩種watches,一種是data watches,另一種是child watches。其中,getData()和exists()以及create()等會添加data watches,getChildren()會添加child watches。而delete()涉及到刪除數據和子節點,會同時觸發data watches和child watches。
詳細可以參考:http://www.geminikwok.com/2011/09/08/%E6%B5%85%E8%B0%88zookeeper-watch%E4%BA%8B%E4%BB%B6/
算 法
Paoxs算法 本篇中僅用單臺server做demo。
以上就是如何理解C#.NET分布式鎖服務,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。