Socket.IO

在現實景況下,並不是所有的client都適合websocket,為了解決這樣的問題,就有了socket.io來讓websocket可以適用給所有的client,它其實並不是websocket的分支,只是架在websocket來執行所有之前所碰到無法連到client的問題。而封裝在websocket protocol有了一個新的名字,它叫做engine.io protocol。 Socket.io還有一個特別的能力就是可以多人(multiplexing)連線,他可以產生多個 Namespace,也就是說他是多個communications channel但分享在同一個underlying connection,而socket.io又有另外一個特性是Room的機制。

Room Support: Within each Namespace, you can define arbitrary channels, called Rooms, that sockets can join and leave. You can then broadcast to any given room, reaching every socket that has joined it.

Socket.IO特性整理

  • Events 自訂事件。

  • Rooms Room 的概念只存在於伺服器端。可以理解為訊息處理時的聽眾分組,可對同一個分組內的聽眾進行廣播。

  • Namespaces 命名空間,我理解為底層連線的分組管理,不同命名空間可以走同一條 Engine.io 連線或是各自連線,每個命名空間可以各自驗證是否接受連線。

  • ACK 回調 如同 HTTP 之於 TCP,HTTP 為 TCP 提供了一套請求與響應的模型。ACK 也為 Socket.io 提供了一套請求與響應的通訊模型。

  • 連線維護

  • 自動斷線重連

  • ping/pong 心跳

Socket.IO協議

技術詳解參考

實作測試

先介紹我測試架構,透過spring boot 啟動 socket.IO server

Configuration

Chat object

EventHandler

Runner

Chat Test html

使用Github上Demo > https://github.com/mrniko/netty-socketio-demo

利用Redis Pub/Sub 機制, Session store used RedissonStore

當有需要用到多台SocketIO server 時, 可透過Redis session store & Redis Pub/Sub 做資源共享達到 LoadBalance。 PubSubListener 需要複寫( CONNECT, DISCONNECT, JOIN, LEAVE, DISPATCH ) 詳細參考網站:https://juejin.cn/post/6844903946184556557

最終架構圖解

Configuration

EventHandler

PubSubListener - Dispatch

實作SSL/TLS機制

Java 在讀取憑證或是密鑰,須透過 JKS(java keystore)的方式進行. 產生金鑰及憑證就需要在導入進去JKS.

產生證書及私鑰

wss 連線成功

壓力測試 - JMeter

花了一些時間測試下來,最後可能會受到本機電腦port的限制,所以可能需要多台設備來進行壓測。

主要流程
JMeter 壓測實例
JMeter Pressure Test Result Report

壓力測試報告 - JMeter

經過一連串的測試兩台電腦對一台server測試,透過Jconsole查看設備的記憶體及CPU運作狀況,在針對其瓶頸進行排除是否能夠在進行突破。

測試紀錄:

  • 1000 條連線 ------ OK

  • 2000 條連線 ------ OK

  • 3000 條連線 ------ OK

小問題紀錄:

調整JMeter 使用記憶體大小。範例為 MaxOS 調整方式。調整完再執行 jmeter 可透過Jconsole看到記憶體大小是否有調整成功。

修改jmeter unix 執行檔 Max 1g -> 4g
Detail 可查看記憶體資訊

利用Jconsole遠端監控 Socket.IO Server 系統資訊。

需要將以下Jvm options 加入到啟動參數。

壓力測試 - Java Client

Java Client 去做壓力測試,測試過程每一台電腦人數上限65個就無法再往上提升,目前此狀況原因不明,尚需時間去查找問題。

Last updated