日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...

發布時間:2024/7/23 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是“Java秒殺系統實戰系列文章”的第十六篇,本文我們將繼續秒殺系統的優化之路,采用統一協調調度中心中間件ZooKeeper控制秒殺系統中高并發多線程對于共享資源~代碼塊的并發訪問所出現的并發安全問題,即用ZooKeeper實現一種分布式鎖!

ZooKeeper,看到其名字,不由得聯想至 Zoo + Keeper,即動物園的看管所!這個寓意用以表達的是一種統一協調管理思想,動物園有很多動物,這些動物就類似于分布式系統架構時代所部署的不同系統服務節點,而這些動物~服務節點偶爾可能需要打交道,相互之間可能需要進行相應的問候,這個時候得需要有一個“看管者”,其職責除了需要管理動物園里的這些動物的行為之外(即這些系統服務的行為),還需要統一協調管理這些動物之間的“問候”、“打交道”(系統服務之間的調用)!

ZooKeeper對外會提供一個多層級的節點命名空間(節點稱為ZNode),每個節點都用一個以斜杠(/)分隔的路徑表示,而且每個節點都有父節點(根節點除外)。ZooKeeper的相關功能特性在實際使用過程中,其底層可能需要動態的添加、刪減相應的節點,此時zk會提供一個Watcher監聽器,用以監聽那些動態新增、刪減的節點,即ZooKeeper會在某些業務場景對一些節點使用上Watcher機制,監聽相應的節點的動態。

我們即將要在下面介紹的“分布式鎖”功能組件即為ZooKeeper提供給開發者的一大利器,其底層的實現原理正是基于Watcher機制 + 動態創建、刪減臨時順序節點 所實現的,值得一提的是,一個ZNode節點將代表一個路徑。

以下為ZooKeeper實現(獲取)分布式鎖的原理:

(1)當前線程在獲取分布式鎖的時候,會在ZNode節點(ZNode節點是Zookeeper的指定節點)下創建臨時順序節點,釋放鎖的時候將刪除該臨時節點。

(2)客戶端/服務調用createNode方法在 ZNode節點 下創建臨時順序節點,然后調用getChildren(“ZNode”)來獲取ZNode下面的所有子節點,注意此時不用設置任何Watcher。

(3)客戶端/服務獲取到所有的子節點path之后,如果發現自己創建的子節點序號最小,那么就認為該客戶端獲取到了鎖,即當前線程獲取到了分布式鎖。

(4)如果發現自己創建的節點并非ZNode所有子節點中最小的,說明自己還沒有獲取到鎖,此時客戶端需要找到比自己小的那個節點,然后對其調用exist()方法,同時對其注冊事件監聽器。

之后,讓這個被關注的節點刪除(核心業務邏輯執行完,釋放鎖的時候,就是刪除該節點),則客戶端的Watcher會收到相應的通知,此時再次判斷自己創建的節點是否是ZNode子節點中序號最小的,如果是則獲取到了鎖,如果不是則重復以上步驟繼續獲取到比自己小的一個節點并注冊監聽。

以上為ZooKeeper的基本介紹以及關于其底層實現分布式鎖的原理的介紹,但是,Debug想說的是“理論再好,如果不會轉化為實際的代碼或者輸出,那只能稱之為泛泛而談、吹牛逼” !

下面,我們將基于SpringBoot搭建的秒殺系統整合ZooKeeper,并基于ZooKeeper實現一種分布式鎖,以此解決秒殺系統中高并發多線程并發產生的諸多問題。

(1)首先,當然是引入ZooKeeper的依賴啦,其中zk的版本在這里我們采用3.4.10,zk客戶端操作實例curator的版本為2.12.0.

org.apache.zookeeper zookeeper 3.4.10org.slf4j slf4j-log4j12 log4j log4j org.apache.curator curator-framework 2.12.0org.apache.curator curator-recipes 2.12.0

緊接著,是在配置文件application.properties中加入ZooKeeper的配置,包括其服務所在的Host、端口Port、命名空間等等:

#zookeeperzk.host=127.0.0.1:2181zk.namespace=kill

(2)然后,跟Redis、Redisson一樣,我們需要基于Spring Boot自定義注入ZooKeeper的相關操作Bean組件,即CuratorFramework實例的自定義配置,如下所示:

//ZooKeeper組件自定義配置@Configurationpublic class ZooKeeperConfig { @Autowired private Environment env; //自定義注入ZooKeeper客戶端操作實例 @Bean public CuratorFramework curatorFramework(){ CuratorFramework curatorFramework=CuratorFrameworkFactory.builder() .connectString(env.getProperty("zk.host")) .namespace(env.getProperty("zk.namespace")) //重試策略 .retryPolicy(new RetryNTimes(5,1000)) .build(); curatorFramework.start(); return curatorFramework; }}

(3)接著,我們就可以拿來使用了,在KillService秒殺服務類中,我們創建了一個新的秒殺處理方法killItemV5,表示借助ZooKeeper中間件解決高并發多線程并發訪問共享資源~共享代碼塊出現的并發安全問題!

@Autowiredprivate CuratorFramework curatorFramework;//TODO:路徑就相當于一個ZNodeprivate static final String pathPrefix="/kill/zkLock/";//商品秒殺核心業務邏輯的處理-基于ZooKeeper的分布式鎖@Overridepublic Boolean killItemV5(Integer killId, Integer userId) throws Exception { Boolean result=false; //定義獲取分布式鎖的操作組件實例 InterProcessMutex mutex=new InterProcessMutex(curatorFramework,pathPrefix+killId+userId+"-lock"); try { //嘗試獲取分布式鎖 if (mutex.acquire(10L,TimeUnit.SECONDS)){ //TODO:核心業務邏輯 if (itemKillSuccessMapper.countByKillUserId(killId,userId) <= 0){ ItemKill itemKill=itemKillMapper.selectByIdV2(killId); if (itemKill!=null && 1==itemKill.getCanKill() && itemKill.getTotal()>0){ int res=itemKillMapper.updateKillItemV2(killId); if (res>0){ commonRecordKillSuccessInfo(itemKill,userId); result=true; } } }else{ throw new Exception("zookeeper-您已經搶購過該商品了!"); } } }catch (Exception e){ throw new Exception("還沒到搶購日期、已過了搶購時間或已被搶購完畢!"); }finally { //釋放分布式鎖 if (mutex!=null){ mutex.release(); } } return result;}

從上述該源代碼中可以看出其核心的處理邏輯在于“定義操作組件實例”、“獲取鎖”以及“釋放鎖”的實現上,如下所示:

//定義獲取分布式鎖的操作組件實例InterProcessMutex mutex=new InterProcessMutex(curatorFramework,pathPrefix+killId+userId+"-lock");//嘗試獲取分布式鎖mutex.acquire(10L,TimeUnit.SECONDS)//釋放鎖mutex.release();

(4)至此,基于統一協調調度中心中間件ZooKeeper實現的分布式鎖的代碼我們已經實戰完畢了,下面我們按照慣例,進入壓測環節,數據用例以及壓測的線程組的線程數我們仍舊跟以前一樣,total=6本書,用戶Id為10040~10049即10個用戶,線程數為1w。

點擊JMeter的啟動按鈕,即可發起秒級并發1w個線程的請求,稍等片刻(因為ZooKeeper需要不斷的在當前設定的節點創建、刪除臨時節點,故而耗時還是比較長的),觀察控制臺的輸出以及數據庫表item_kill、item_kill_success表最終的數據記錄結果,如下圖所示:

對于這樣的結果,可謂是皆大歡喜吧!至此,本文關于ZooKeeper的應用實戰我們就介紹到這里了!

相關視頻教程可私信咨詢。

推薦閱讀:

Java商城秒殺系統的設計與實戰教程(SpringBoot版)

Java秒殺系統實戰系列-構建SpringBoot多模塊項目

Java秒殺系統實戰系列-基于Redis的原子操作優化秒殺邏輯

總結

以上是生活随笔為你收集整理的ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。