如何利用數據庫實現簡單的分佈式鎖

問題:

現在的手頭的項目大多開始使用nodejs了,nodejs的單線程本質,導致大多數nodejs的項目都採用pm2等類似的進程管理工具,採用多進程的方式(也即是同時啓動目標項目的多個實例),提高應用的吞吐量和cpu的利用率。但這也要求在軟件設計上,儘量保持上下文無關,進程間無資源競爭關係。但是多數情況下,這個問題有不可避免,例如一些計數操作等。

市面上有很多分佈式鎖的應用,例如zookeeper等,但有的時候,不想因爲本身不太重的需求,而引入更多的依賴。所以利用已有的軟件依賴,實現分佈式鎖就是一個好的選擇。


解決方案:

大部分項目都是需要引入數據庫,所以下面簡單描述一個利用數據庫提供的互斥或者說鎖的能力,來實現我們需要的分佈式鎖。以mongodb爲例:

1,表格結構設計:

key代表所有鎖定的資源id

2,如何獲取鎖:

原理很簡單,就是嘗試在上述表格中,插入一個代表資源id的項,因爲這個id帶有唯一索引,所以只能可能有一個進程寫入成功,也就是獲取了鎖,其它的進程需要等待,但記得設置最大等待時間。操作成功後要釋放鎖,也就是刪除之前的記錄。鎖也要設置最大鎖定時間,避免資源無法釋放。

3,如果依賴的數據庫是分佈式帶切片的數據庫,那可以單獨選出一個切片,作爲單獨的分佈式鎖的實現宿主。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章