并發設計模式實戰系列(2):領導者/追隨者模式

?

🌟 ?大家好,我是摘星!??🌟

今天為大家帶來的是并發設計模式實戰系列,第二章領導者/追隨者(Leader/Followers)模式,廢話不多說直接開始~

目錄

領導者/追隨者(Leader/Followers)

為什么需要領導者/追隨者(Leader/Followers)模式?

一、核心原理深度拆解

1. 角色輪轉機制

2. 關鍵技術實現

二、生活化類比:醫院分診系統

三、Java代碼實現(生產級Demo)

1. 完整可運行代碼

2. 關鍵機制說明

四、橫向對比表格

1. 線程模型對比

2. 性能優化策略對比

五、高級實踐技巧

1. 動態Leader選舉優化

2. 負載均衡策略

3. 監控關鍵指標

六、總結與適用場景

1. 核心優勢

2. 典型應用場景

3. 模式局限


領導者/追隨者(Leader/Followers)

為什么需要領導者/追隨者(Leader/Followers)模式?

在現代高并發系統中,我們面臨一個關鍵挑戰:
高并發監聽 vs. 高效任務處理

  • 監聽瓶頸:傳統Reactor模式中,單個Selector線程可能成為性能瓶頸(如10萬+連接時)
  • 線程競爭:多線程同時監聽同一Selector會導致epoll_ctl鎖競爭(Linux內核級鎖)
  • 上下文切換:任務隊列的生產者-消費者模型引入額外調度開銷

領導者/追隨者模式通過角色輪換機制解決這一矛盾:

  • Leader線程:獨占監聽權限,避免多線程競爭Selector
  • Follower線程:無監聽開銷,專注處理任務
  • 動態切換:處理事件后立即移交領導權,實現負載均衡

一、核心原理深度拆解

1. 角色輪轉機制

              +-----------------+|  事件到達        |+--------+--------+|+-----------v-----------+ | Leader線程監聽事件     |←----++-----------+-----------+     || 處理事件        |+-----------v-----------+     || 指定新Leader          |     |+-----------+-----------+     ||                 |+-----------v-----------+     || Follower晉升為Leader  |-----++-----------------------+
  • 三階段工作流
    1. 監聽事件:Leader線程獨占監聽資源(如Selector)
    2. 事件分派:檢測到事件后指定新Leader
    3. 角色轉換:原Leader轉為Worker處理事件,新Leader繼續監聽

2. 關鍵技術實現

  • 線程狀態管理:使用AtomicInteger記錄角色狀態(LEADER=0, PROCESSING=1, FOLLOWER=2)
  • 無鎖化設計:通過CAS操作實現Leader選舉
  • 事件分發器:維護ThreadPool保存所有工作線程

二、生活化類比:醫院分診系統

系統組件

現實類比

核心行為

Leader線程

導診臺護士

識別患者類型,分配接診醫生

Follower線程

診室醫生

專注處理當前患者

事件隊列

候診區座位

緩沖等待處理的患者

  • 工作流程
    1. 導診護士(Leader)發現新患者
    2. 指定空閑醫生(新Leader)接替導診工作
    3. 原護士轉為醫生處理當前患者

三、Java代碼實現(生產級Demo)

1. 完整可運行代碼

import java.nio.channels.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;public class LeaderFollowersServer {private static final int MAX_THREADS = 8;private final AtomicInteger leaderStatus = new AtomicInteger(0); // 0=可用, 1=忙碌// 線程工作單元class Worker implements Runnable {private final Selector selector;private volatile boolean isLeader = false;public Worker(Selector selector) {this.selector = selector;}@Overridepublic void run() {while (!Thread.interrupted()) {try {// 嘗試成為Leaderif (leaderStatus.compareAndSet(0, 1)) {isLeader = true;System.out.println(Thread.currentThread().getName() + " 成為Leader");// 監聽事件(非阻塞模式)selector.selectNow();for (SelectionKey key : selector.selectedKeys()) {if (key.isAcceptable()) {handleAccept((ServerSocketChannel) key.channel());}}// 移交Leader身份leaderStatus.set(0);isLeader = false;} else {// 作為Follower處理事件TimeUnit.MILLISECONDS.sleep(100);}} catch (Exception e) {e.printStackTrace();}}}private void handleAccept(ServerSocketChannel server) {try {SocketChannel client = server.accept();System.out.println(Thread.currentThread().getName() + " 處理連接: " + client);// 模擬業務處理TimeUnit.MILLISECONDS.sleep(500);} catch (Exception e) {e.printStackTrace();}}}public void start() throws Exception {Selector selector = Selector.open();ServerSocketChannel ssc = ServerSocketChannel.open();ssc.bind(new java.net.InetSocketAddress(8080));ssc.configureBlocking(false);ssc.register(selector, SelectionKey.OP_ACCEPT);ExecutorService pool = Executors.newFixedThreadPool(MAX_THREADS);for (int i = 0; i < MAX_THREADS; i++) {pool.execute(new Worker(selector));}}public static void main(String[] args) throws Exception {new LeaderFollowersServer().start();}
}

2. 關鍵機制說明

// CAS實現無鎖選舉
if (leaderStatus.compareAndSet(0, 1)) { // 成功獲取Leader身份
}// 優雅退出處理
selector.wakeup(); // 喚醒阻塞的select()
pool.shutdownNow(); // 關閉線程池

四、橫向對比表格

1. 線程模型對比

特性

Leader/Followers

Half-Sync/Half-Async

Reactor

上下文切換

少(角色轉換)

中等

多(事件傳遞)

資源消耗

低(固定線程數)

中等

吞吐量

高(無鎖設計)

極高

適用場景

短連接服務

混合型任務

純異步任務

編程復雜度

高(需處理狀態轉換)

中等

2. 性能優化策略對比

優化方向

Leader/Followers

傳統線程池

CPU利用率

通過角色切換減少競爭

依賴隊列管理

內存消耗

固定線程數控制

動態擴容可能OOM

延遲穩定性

更均勻的任務分配

存在長尾效應

擴展性

水平擴展需重新設計

容易增加線程數


五、高級實踐技巧

1. 動態Leader選舉優化

// 使用Phaser實現協調
Phaser phaser = new Phaser(1);
while (true) {phaser.arriveAndAwaitAdvance();// 選舉新Leader...
}

2. 負載均衡策略

// 基于處理能力的Leader選擇
if (worker.getLoad() < threshold) {promoteToLeader(worker);
}

3. 監控關鍵指標

// Leader切換頻率監控
AtomicLong leaderChangeCount = new AtomicLong();// 線程負載統計
ConcurrentHashMap<Worker, Integer> workloadMap = new ConcurrentHashMap<>();

六、總結與適用場景

1. 核心優勢

? 低競爭:單線程監聽 + 動態Leader選舉,減少鎖爭用
? 高吞吐:無隊列中轉,事件直接由工作線程處理
? 資源可控:固定線程數,避免OOM風險

2. 典型應用場景

  • 短連接服務:如HTTP API網關、游戲服務器
  • 低延遲系統:金融交易訂單處理
  • 均勻負載場景:任務處理耗時差異小的業務

3. 模式局限

?? 不適合長任務:Leader長時間占用會導致監聽阻塞
?? 實現復雜度高:需精細控制線程狀態轉換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79427.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自求導實現線性回歸與PyTorch張量詳解

目錄 前言一、自求導的方法實現線性回歸1.1自求導的方法實現線性回歸的理論講解1.1.1 線性回歸是什么&#xff1f;1.1.2線性回歸方程是什么&#xff1f;1.1.3散點輸入1.2參數初始化1.2.1 參數與超參數1.2.1.1 參數定義1.2.1.2 參數內容1.2.1.3 超參數定義1.2.1.4 超參數內容1.…

2025年機電一體化、機器人與人工智能國際學術會議(MRAI 2025)

重要信息 時間&#xff1a;2025年4月25日-27日 地點&#xff1a;中國濟南 官網&#xff1a;http://www.icmrai.org 征稿主題 機電一體化機器人人工智能 傳感器和執行器 3D打印技術 智能控制 運動控制 光電系統 光機電一體化 類人機器人 人機界面 先進的運動控制 集成制造系…

線性代數 | 知識點整理 Ref 3

注&#xff1a;本文為 “線性代數 | 知識點整理” 相關文章合輯。 因 csdn 篇幅合并超限分篇連載&#xff0c;本篇為 Ref 3。 略作重排&#xff0c;未整理去重。 圖片清晰度限于引文原狀。 如有內容異常&#xff0c;請看原文。 《線性代數》總復習要點、公式、重要結論與重點釋…

CFD中的動量方程非守恒形式詳解

在計算流體力學&#xff08;CFD&#xff09;中&#xff0c;動量方程可以寫成守恒形式和非守恒形式&#xff0c;兩者在數學上等價&#xff0c;但推導方式和應用場景不同。以下是對非守恒形式的詳細解釋&#xff1a; 1. 動量方程的守恒形式 首先回顧守恒形式的動量方程&#xff…

Leetcode 1504. 統計全 1 子矩形

1.題目基本信息 1.1.題目描述 給你一個 m x n 的二進制矩陣 mat &#xff0c;請你返回有多少個 子矩形 的元素全部都是 1 。 1.2.題目地址 https://leetcode.cn/problems/count-submatrices-with-all-ones/description/ 2.解題方法 2.1.解題思路 單調棧 時間復雜度&…

【Docker】運行錯誤提示 unknown shorthand flag: ‘d‘ in -d ----詳細解決方法

使用docker拉取Dify的時候遇到錯誤 錯誤提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]錯誤原因解析 出現 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式與當前版本不兼容&#xff0c;具體分為以下兩種情況&#xff1a; 新…

華為OD機試真題——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《攀登者2…

qt硬件與軟件通信中 16進制與十進制轉化

1. 首先上代碼, 這是在qt語言上的操作 截取 01 03 0C 00 00 00 00 00 00 00 0C 00 0C 00 0C 93 70 這串16進制數值進行處理&#xff0c;截取這樣一段內容 00 0C 00 0C 00 0C 字節數組轉字符串。從bytearray數組轉換為string. QString CustomTcpSocket::recieveInfo() {QByteArr…

圖形變換算法

一、學習目的 &#xff08;1&#xff09;掌握多面體的存儲方法。 &#xff08;2&#xff09;掌握圖形的幾何變換及投影變換。 &#xff08;3&#xff09;掌握三維形體不同投影方法的投影圖的生成原理。 &#xff08;4&#xff09;掌握多面體投影圖繪制的編程方法。 二、學…

【JAVAFX】自定義FXML 文件存放的位置以及使用

情況 1&#xff1a;FXML 文件與調用類在同一個包中&#xff08;推薦&#xff09; 假設類 MainApp 的包是 com.example&#xff0c;且 FXML 文件放在 resources/com/example 下&#xff1a; 項目根目錄 ├── src │ └── sample │ └── Main.java ├── src/s…

Ubuntu20.04安裝企業微信

建議先去企業微信官網看一下有沒有linux版本&#xff0c;沒有的話在按如下方式安裝&#xff0c;不過現在是沒有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火應用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人對docker不太熟悉&#xff0c;現…

CSS appearance 屬性:掌握UI元素的原生外觀

在現代網頁設計中&#xff0c;為了達到一致的用戶體驗&#xff0c;我們有時需要讓HTML元素模仿操作系統的默認控件樣式。CSS中的appearance屬性提供了一種簡便的方式來控制這些元素是否以及如何顯示其默認外觀。本文將詳細介紹appearance屬性&#xff0c;并通過實際代碼示例來展…

十四、C++速通秘籍—函數式編程

目錄 上一章節&#xff1a; 一、引言 一、函數式編程基礎 三、Lambda 表達式 作用&#xff1a; Lambda 表達式捕獲值的方式&#xff1a; 注意&#xff1a; 四、函數對象 函數對象與普通函數對比&#xff1a; 五、函數適配器 1、適配普通函數 2、適配 Lambda 表達式 …

大模型Rag-指令調度

本文主要記錄根據用戶問題指令&#xff0c;基于大模型做Rag&#xff0c;匹配最相關描述集進行指令調度&#xff0c;可用于匹配后端接口以及展示答案及圖表等。 1.指令查詢處理邏輯 1.實現思路 指令識別&#xff1a;主要根據用戶的問題q計算與指令描述集is [i0, ... , im]和指…

音視頻學習 - ffmpeg 編譯與調試

編譯 環境 macOS Ventrua 13.4 ffmpeg 7.7.1 Visual Studio Code Version: 1.99.0 (Universal) 操作 FFmpeg 下載源碼 $ cd ffmpeg-x.y.z $ ./configure nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake…

golang-常見的語法錯誤

https://juejin.cn/post/6923477800041054221 看這篇文章 Golang 基礎面試高頻題詳細解析【第一版】來啦&#xff5e; 大叔說碼 for-range的坑 func main() { slice : []int{0, 1, 2, 3} m : make(map[int]*int) for key, val : range slice {m[key] &val }for k, v : …

音視頻之H.265/HEVC預測編碼

H.265/HEVC系列文章&#xff1a; 1、音視頻之H.265/HEVC編碼框架及編碼視頻格式 2、音視頻之H.265碼流分析及解析 3、音視頻之H.265/HEVC預測編碼 預測編碼是視頻編碼中的核心技術之一。對于視頻信號來說&#xff0c;一幅圖像內鄰近像素之間有著較強的空間相關性,相鄰圖像之…

基于政務問答的dify接口請求測試

Dify 的智能體后端服務 API 為開發者提供便捷方式&#xff0c;能讓前端應用直接調用大語言模型能力。在請求時&#xff0c;需先前往應用左側導航的 “API Access” 部分&#xff0c;在此可查看文檔和管理訪問憑據。為保障安全&#xff0c;API 密鑰應通過后端調用&#xff0c;避…

VMware Workstation 保姆級 Linux(CentOS) 創建教程(附 iso)

文章目錄 一、下載二、創建 一、下載 CentOS-7.9-x86_64-DVD-2009.iso 二、創建 VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包)

擴增子分析|基于R語言microeco包進行微生物群落網絡分析(network網絡、Zi-Pi關鍵物種和subnet子網絡圖)

一、引言 microeco包是福建農林大學姚敏杰教授團隊開發的擴增子測序集成分析。該包綜合了擴增子測序下游分析的多種功能包括群落組成、多樣性、網絡分析、零模型等等。通過簡單的幾行代碼可實現復雜的分析。因此&#xff0c;microeco包發表以來被學界廣泛關注&#xff0c;截止2…