由於業務需要,需要做一個強制下線的功能(類似QQ、釘釘這種在相同平臺上登入多個賬號,下線之前已登入的賬號)。
經過一些列的調研,發現SignalR這個框架實現起來比較簡單
由於我們的客戶是零散的終端使用者,併發量是首先需要考慮的,寫個測試案例進行連線例項測試。
建立了一臺虛擬機器Centos7版本,開始連線,每次連線不到1024個,就無法建立連線了
這裡主要有2個原因,
第1個是linux的檔案訪問數量被限制,可以透過命令ulimit -n 檢視1024
第2個是nginx的預設最大連線數也是1024.
需要進行如下調整,為了測試併發量,下面的併發數量統一設定為102400左右進行驗證
**增加系統資源限制
編輯/etc/sysctl.conf
中設定了適當的引數
fs.file-max = 201200
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
編輯 /etc/security/limits.conf 檔案,新增以下內容: * soft nofile 102400 * hard nofile 102400 編輯 /etc/sysctl.conf,新增或修改以下內容: fs.file-max =102400
在/etc/systemd/system.conf
檔案中新增或修改以下行:
DefaultLimitNOFILE=102400
DefaultLimitNPROC=102400 #這行可以先不加
在/etc/systemd/user.conf
檔案中新增或修改以下行
DefaultLimitNOFILE=102400
DefaultLimitNPROC=102400 #這行可以先不加
調整 Nginx 配置 worker_processes auto; worker_rlimit_nofile 102400; events { worker_connections 102400; multi_accept on; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
#server 這部分可以單獨配置在 /etc/nginx/conf.d/*.conf;
server { listen 80; server_name 192.168.208.131; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
後臺介面程式碼中增加了這些,可能沒什麼用途,有時間在移除單獨測試
//用來實現實時通訊 builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxConcurrentConnections = 102400; serverOptions.Limits.MaxConcurrentUpgradedConnections = 102400; serverOptions.Limits.MaxRequestBodySize = 52428800; // 50 MB serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1); // 配置更多 Kestrel 伺服器設定 serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2); serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromSeconds(30); serverOptions.AddServerHeader = false; // 監聽特定的 IP 和埠 serverOptions.ListenAnyIP(5000, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; }); });
經過上面的一些列設定後,本機可以連線過萬,部署到雲端伺服器,同時擁有7臺終端進行連線,測試併發量到1.7萬連線沒有問題,由於終端數量有限,無法測試更多的連線。理論上應該是支援更多的連線。