首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Muduo 限制服務器最大並發連接數的輕量級實現

     編輯:關於C++

為何限制並發連接?

  • 防止服務過載。
  • File Descriptor 是稀缺資源,耗盡極難處理(類似 bad_alloc)。

Muduo Acceptor 採用 libev 作者建議:預留一個閒置 FD,accept 失敗時關閉閒置 FD 再 accept 獲取錯誤碼,再重開閒置 FD。但多線程下有 Race Condition。

簡單有效的 Soft Limit 方案

設定略低於 Hard Limit 的 Soft Limit(如 1024 → 1000),超過主動 shutdown() 新連接,保留餘裕。單線程版實現:

class EchoServer {
    // ...
    int numConnected_ = 0;
    const int kMaxConnections_;
public:
    EchoServer(..., int maxConnections) : kMaxConnections_(maxConnections) {}
    void onConnection(const TcpConnectionPtr& conn) {
        if (conn->connected()) {
            if (++numConnected_ > kMaxConnections_) conn->shutdown();
        } else {
            --numConnected_;
        }
        LOG_INFO << "numConnected = " << numConnected_;
    }
};

多線程版將 numConnected_ 改為 muduo::AtomicInt32。shutdown() 前可發送飽和提示,幫助 Client 快速 Failover。

後續主題

下一篇將介紹 Timing Wheel 處理空閒連接超時。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved