日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【C#|.NET】分布式鎖服務(wù)

 昵稱10504424 2012-09-11

背  景

分布式鎖服務(wù)在大家的項目中或許用的不多,因為大家都把排他放在數(shù)據(jù)庫那一層來擋。當(dāng)大量的行鎖、表鎖、事務(wù)充斥著數(shù)據(jù)庫的時候,不如換個角度思考問題。一般web應(yīng)用很多的瓶頸都在數(shù)據(jù)庫上,這里給大家介紹的是減輕數(shù)據(jù)庫鎖負(fù)擔(dān)的一種方案。


 

簡  介

如果我們的需求很簡單,例如對于用戶的賬戶資金,要保證原子性操作。并且不同的客戶端在同一時間內(nèi)只能提交一個對象操作。lock、單例?!在單臺上還可以,但是大型web項目上,負(fù)載均衡是常用的技術(shù)手段手段,同一意義的對象可能存在不同的副本,這時我們又如何保證排他操作。數(shù)據(jù)庫的事務(wù)!除了這個,接下來我們引出本章的主題、分布式鎖服務(wù)。

一個簡單的鎖服務(wù)實現(xiàn)起來并不難,甚至利用memcache很快就能構(gòu)造一套分布式鎖系統(tǒng)。我們只需要在操作對象時寫入kv鍵值對,操作完畢時釋放kv,在讀取對象時判斷kv中是否有數(shù)據(jù)就可以了,我們甚至還可以給它一個默認(rèn)的釋放時間。

這是一種解決方案,但是如果我們的要求更高一點,我們需要權(quán)限認(rèn)證(例如只能來自xxx域名的請求)、需要上下級節(jié)點關(guān)聯(lián)(例如一個用戶的資金賬戶被鎖住,同時鎖住他的購物車、積分等)、需要監(jiān)視器回調(diào)、甚至需要考慮單點故障問題。那么,蟲子在這里推薦另一套方案----zookeeper。


 

zookeeper

官方文檔:http://zookeeper./doc/r3.3.2/zookeeperOver.html#ch_DesignOverview

下載:http://zookeeper./releases.html

Zookeeper是Hadoop中的一個模塊。是一個分布式的,開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù),用它可以來現(xiàn)同步服務(wù),配置維護。

更多的內(nèi)容大家看文檔吧或者直接網(wǎng)上搜一下,理論性的內(nèi)容寫多了讓人困。我們直接看實踐。


 

性能篇

服務(wù)器ubuntu (虛擬機一臺)

客戶端window2003

服務(wù)端安裝好java環(huán)境 然后跟著官方的介紹部署

啟動zkserver

我們測試下鎖服務(wù)相關(guān)的操作

ps:試下本機的windows2003  因為是本地環(huán)境 不于上面做對比 僅看看zookeeper本身的數(shù)據(jù)處理效率


 

功能篇

一張圖就可以介紹完普通功能

再看下watcher

  1. public class MyWatch : IWatcher  
  2.     {  
  3.         public void Process(WatchedEvent qevent)  
  4.         {  
  5.             Console.WriteLine("this is MyWatch");  
  6.         }       
  7.     }  
  8. public class MyWatch2 : IWatcher  
  9.     {  
  10.         public void Process(WatchedEvent qevent)  
  11.         {  
  12.             Console.WriteLine("this is MyWatch2");  
  13.         }     
  14.     } 

創(chuàng)建連接時 new ZooKeeper("192.168.206.129:2181", new TimeSpan(0, 0, 0, 4000), new MyWatch());

檢查是否存在時zk.Exists(Dir, new MyWatch2());

獲取數(shù)據(jù)時zk.GetData(Dir, new MyWatch2(), stat);

我們再運行一遍之前的demo  去掉delete操作

加上delete操作


 

淺  析

創(chuàng)建連接:

  1. 獲取服務(wù)主機列表
  2. 設(shè)置超時時間
  3. 注冊客戶端事件
  4. 以線程安全的方式創(chuàng)建請求連接(啟動客戶端請求隊列,循環(huán)隊列基于socket通信、根據(jù)請求類型執(zhí)行不同的請求動作)

請求流程:

構(gòu)造請求頭、構(gòu)造request,reponse、構(gòu)造響應(yīng)頭、構(gòu)造Packet對象,packet對象準(zhǔn)備好后,把整個對象放入一個outgoingQueue
packet被放入outgoingQueue中,等待SendThread把packet對應(yīng)的內(nèi)容發(fā)送給server。server處理分3步在 doio方法中ReadLength ReadConnectResult ReadResponse,直到ReadResponse方法中確定packet請求結(jié)束。

響應(yīng)流程:

針對心跳的ping請求的resp,針對auth請求的resp,一般接口請求的resp,如果接口請求要求了watcher,當(dāng)watcher關(guān)注的內(nèi)容有變化時的notification

鎖相關(guān)部分API方法:

創(chuàng)建節(jié)點:create

demo:zk.Create(Dir, severname.GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);

其中CreateMode分為4類Persistent、PersistentSequential、Ephemeral、EphemeralSequential

PERSISTENT 創(chuàng)建持久化節(jié)點,對應(yīng)機器關(guān)閉連接后節(jié)點/數(shù)據(jù)不會消失

PERSISTENT_SEQUENTIAL 如果PATH是以’/’結(jié)尾則以這個PATH作為父節(jié)點,創(chuàng)建一個子節(jié)點,其子節(jié)點名字是一個按先后順序排列的數(shù)值;否則創(chuàng)建一個名字是'/’后面字符加上先后順序排列的數(shù)值字符串的節(jié)點,同樣創(chuàng)建持久節(jié)點

EPHEMERAL 創(chuàng)建瞬時節(jié)點,Zookeeper在感知連接機器宕機后會清除它創(chuàng)建的瞬時節(jié)點

EPHEMERAL_SEQUENTIAL 穿件瞬時順序節(jié)點,和PERSISTENT_SEQUENTIAL一樣,區(qū)別在于它是瞬時的

刪除節(jié)點 delete

demo :zk.Delete(Dir, -1);

前一個參數(shù)代表節(jié)點名稱(一般用作路徑),后一個是版本號 -1表示全匹配

查看節(jié)點 exists

demo : zk.Exists(Dir, new MyWatch2());

獲取數(shù)據(jù) getData 

demo :zk.GetData(Dir, new MyWatch2(), stat);

獲取一個節(jié)點的數(shù)據(jù),可注入watcher 

設(shè)置數(shù)據(jù) setData 

demo : zk.SetData(Dir, new byte[1], 1);

獲取下級節(jié)點集合 GetChildren

demo :zk.GetChildren(Dir, true);

存  儲

znodes類似文件和目錄。但它不是一個典型的文件系統(tǒng),zookeeper數(shù)據(jù)保存在內(nèi)存中,這意味著zookeeper可以實現(xiàn)高吞吐量和低延遲。

watcher

Zookeeper有兩種watches,一種是data watches,另一種是child watches。其中,getData()和exists()以及create()等會添加data watches,getChildren()會添加child watches。而delete()涉及到刪除數(shù)據(jù)和子節(jié)點,會同時觸發(fā)data watches和child watches。

詳細可以參考:http://www./2011/09/08/%E6%B5%85%E8%B0%88zookeeper-watch%E4%BA%8B%E4%BB%B6/

算  法

Paoxs算法 本篇中僅用單臺server做demo 改個時間詳細介紹下Paoxs


 

本篇先到此 希望對大家有幫助

原文鏈接:http://dubing.blog.51cto.com/3911153/791464

【編輯推薦】

  1. C#數(shù)組排序與對象大小比較
  2. 把C#.NET程序移植到DB2上的經(jīng)驗淺談
  3. 淺談C#閉包的相關(guān)原理
  4. 再議C#方法中的反射方式和委托方式
  5. 淺析C#運行時相互關(guān)系

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多