創(chuàng)新互聯(lián)公司主打移動網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名申請、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設(shè)計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
Java 原生 API 雖然有并發(fā)鎖,但并沒有提供分布式鎖的能力,所以針對分布式場景中的鎖需要解決的方案。
分布式鎖的解決方案大致有以下幾種:
1. 創(chuàng)建表
CREATE TABLE `methodLock` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `method_name` varchar(64) NOT NULL DEFAULT '' COMMENT '鎖定的方法名', `desc` varchar(1024) NOT NULL DEFAULT '備注信息', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '保存數(shù)據(jù)時間,自動生成', PRIMARY KEY (`id`), UNIQUE KEY `uidx_method_name` (`method_name `) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='鎖定中的方法';
2. 獲取鎖
想要鎖住某個方法時,執(zhí)行以下 SQL:
insert into methodLock(method_name,desc) values (‘method_name’,‘desc’)
因為我們對
method_name
做了唯一性約束,這里如果有多個請求同時提交到數(shù)據(jù)庫的話,數(shù)據(jù)庫會保證只有一個操作可以成功,那么我們就可以認(rèn)為操作成功的那個線程獲得了該方法的鎖,可以執(zhí)行方法體內(nèi)容。
成功插入則獲取鎖。
3. 釋放鎖
當(dāng)方法執(zhí)行完畢之后,想要釋放鎖的話,需要執(zhí)行以下 Sql:
delete from methodLock where method_name ='method_name'
相比于用數(shù)據(jù)庫來實現(xiàn)分布式鎖,基于緩存實現(xiàn)的分布式鎖的性能會更好一些。目前有很多成熟的分布式產(chǎn)品,包括 Redis、memcache、Tair 等。這里以 Redis 舉例。
單點實現(xiàn)步驟:
可以考慮使用 redisson 的解決方案。
這也是 ZooKeeper 客戶端 curator 的分布式鎖實現(xiàn)。
ZooKeeper 版本的分布式鎖問題相對比較來說少。
總體上來說 ZooKeeper 實現(xiàn)分布式鎖更加的簡單,可靠性更高。但 ZooKeeper 因為需要頻繁的創(chuàng)建和刪除節(jié)點,性能上不如 Redis 方式。
在分布式場景下,一個用戶的 Session 如果只存儲在一個服務(wù)器上,那么當(dāng)負(fù)載均衡器把用戶的下一個請求轉(zhuǎn)發(fā)到另一個服務(wù)器上,該服務(wù)器沒有用戶的 Session,就可能導(dǎo)致用戶需要重新進(jìn)行登錄等操作。
分布式 Session 的幾種實現(xiàn)策略:
需要配置負(fù)載均衡器,使得一個用戶的所有請求都路由到一個服務(wù)器節(jié)點上,這樣就可以把用戶的 Session 存放在該服務(wù)器節(jié)點中。
缺點:當(dāng)服務(wù)器節(jié)點宕機(jī)時,將丟失該服務(wù)器節(jié)點上的所有 Session。

在服務(wù)器節(jié)點之間進(jìn)行 Session 同步操作,這樣的話用戶可以訪問任何一個服務(wù)器節(jié)點。
缺點:占用過多內(nèi)存;同步過程占用網(wǎng)絡(luò)帶寬以及服務(wù)器處理器時間。

使用一個單獨的服務(wù)器存儲 Session 數(shù)據(jù),可以存在 MySQL 數(shù)據(jù)庫上,也可以存在 Redis 或者 Memcached 這種內(nèi)存型數(shù)據(jù)庫。
缺點:需要去實現(xiàn)存取 Session 的代碼。

通常有兩種解決方案:
使用緩存的好處:
根據(jù)業(yè)務(wù)場景,通常緩存有以下幾種使用方式
緩存分類:
輪詢算法把每個請求輪流發(fā)送到每個服務(wù)器上。下圖中,一共有 6 個客戶端產(chǎn)生了 6 個請求,這 6 個請求按 (1, 2, 3, 4, 5, 6) 的順序發(fā)送。最后,(1, 3, 5) 的請求會被發(fā)送到服務(wù)器 1,(2, 4, 6) 的請求會被發(fā)送到服務(wù)器 2。
載均衡算法之輪詢-01.jpg)
該算法比較適合每個服務(wù)器的性能差不多的場景,如果有性能存在差異的情況下,那么性能較差的服務(wù)器可能無法承擔(dān)過大的負(fù)載(下圖的 Server 2)。
載均衡算法之輪詢-02.jpg)
加權(quán)輪詢是在輪詢的基礎(chǔ)上,根據(jù)服務(wù)器的性能差異,為服務(wù)器賦予一定的權(quán)值。例如下圖中,服務(wù)器 1 被賦予的權(quán)值為 5,服務(wù)器 2 被賦予的權(quán)值為 1,那么 (1, 2, 3, 4, 5) 請求會被發(fā)送到服務(wù)器 1,(6) 請求會被發(fā)送到服務(wù)器 2。
載均衡算法之加權(quán)輪詢.jpg)
由于每個請求的連接時間不一樣,使用輪詢或者加權(quán)輪詢算法的話,可能會讓一臺服務(wù)器當(dāng)前連接數(shù)過大,而另一臺服務(wù)器的連接過小,造成負(fù)載不均衡。例如下圖中,(1, 3, 5) 請求會被發(fā)送到服務(wù)器 1,但是 (1, 3) 很快就斷開連接,此時只有 (5) 請求連接服務(wù)器 1;(2, 4, 6) 請求被發(fā)送到服務(wù)器 2,只有 (2) 的連接斷開。該系統(tǒng)繼續(xù)運行時,服務(wù)器 2 會承擔(dān)過大的負(fù)載。
載均衡算法之最少連接-01.jpg)
最少連接算法就是將請求發(fā)送給當(dāng)前最少連接數(shù)的服務(wù)器上。例如下圖中,服務(wù)器 1 當(dāng)前連接數(shù)最小,那么新到來的請求 6 就會被發(fā)送到服務(wù)器 1 上。
載均衡算法之最少連接-02.jpg)
在最少連接的基礎(chǔ)上,根據(jù)服務(wù)器的性能為每臺服務(wù)器分配權(quán)重,再根據(jù)權(quán)重計算出每臺服務(wù)器能處理的連接數(shù)。
載均衡算法之加權(quán)最少連接.jpg)
把請求隨機(jī)發(fā)送到服務(wù)器上。和輪詢算法類似,該算法比較適合服務(wù)器性能差不多的場景。
載均衡算法之隨機(jī).jpg)
源地址哈希通過對客戶端 IP 哈希計算得到的一個數(shù)值,用該數(shù)值對服務(wù)器數(shù)量進(jìn)行取模運算,取模結(jié)果便是目標(biāo)服務(wù)器的序號。
載均衡算法之IpHash.jpg)
HTTP 重定向負(fù)載均衡服務(wù)器收到 HTTP 請求之后會返回服務(wù)器的地址,并將該地址寫入 HTTP 重定向響應(yīng)中返回給瀏覽器,瀏覽器收到后需要再次發(fā)送請求。
缺點:

使用 DNS 作為負(fù)載均衡器,根據(jù)負(fù)載情況返回不同服務(wù)器的 IP 地址。大型網(wǎng)站基本使用了這種方式做為第一級負(fù)載均衡手段,然后在內(nèi)部使用其它方式做第二級負(fù)載均衡。
缺點:

使用 LVS(Linux Virtual Server)這種鏈路層負(fù)載均衡器,根據(jù)負(fù)載情況修改請求的 MAC 地址。

在網(wǎng)絡(luò)層修改請求的目的 IP 地址。

正向代理與反向代理的區(qū)別:
PAC 服務(wù)器是用來判斷一個請求是否要經(jīng)過代理。

分享標(biāo)題:T5大牛帶你解析:如何實現(xiàn)分布式技術(shù)
本文網(wǎng)址:http://www.chinadenli.net/article34/pecepe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站、標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)