乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       昵稱10504424 2012-09-11

      背  景

      分布式鎖服務(wù)在大家的項(xiàng)目中或許用的不多,因?yàn)榇蠹叶及雅潘旁跀?shù)據(jù)庫(kù)那一層來(lái)?yè)酢.?dāng)大量的行鎖、表鎖、事務(wù)充斥著數(shù)據(jù)庫(kù)的時(shí)候,不如換個(gè)角度思考問(wèn)題。一般web應(yīng)用很多的瓶頸都在數(shù)據(jù)庫(kù)上,這里給大家介紹的是減輕數(shù)據(jù)庫(kù)鎖負(fù)擔(dān)的一種方案。


       

      簡(jiǎn)  介

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

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

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


       

      zookeeper

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

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

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

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


       

      性能篇

      服務(wù)器ubuntu (虛擬機(jī)一臺(tái))

      客戶端window2003

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

      啟動(dòng)zkserver

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

      ps:試下本機(jī)的windows2003  因?yàn)槭潜镜丨h(huán)境 不于上面做對(duì)比 僅看看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)建連接時(shí) new ZooKeeper("192.168.206.129:2181", new TimeSpan(0, 0, 0, 4000), new MyWatch());

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

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

      我們?cè)龠\(yùn)行一遍之前的demo  去掉delete操作

      加上delete操作


       

      淺  析

      創(chuàng)建連接:

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

      請(qǐng)求流程:

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

      響應(yīng)流程:

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

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

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

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

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

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

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

      EPHEMERAL 創(chuàng)建瞬時(shí)節(jié)點(diǎn),Zookeeper在感知連接機(jī)器宕機(jī)后會(huì)清除它創(chuàng)建的瞬時(shí)節(jié)點(diǎn)

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

      刪除節(jié)點(diǎn) delete

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

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

      查看節(jié)點(diǎn) exists

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

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

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

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

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

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

      獲取下級(jí)節(jié)點(diǎn)集合 GetChildren

      demo :zk.GetChildren(Dir, true);

      存  儲(chǔ)

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

      watcher

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

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

      算  法

      Paoxs算法 本篇中僅用單臺(tái)server做demo 改個(gè)時(shí)間詳細(xì)介紹下Paoxs


       

      本篇先到此 希望對(duì)大家有幫助

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

      【編輯推薦】

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

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多