smart-socket v1.5.13 版本除了一些細節最佳化,最大的亮點莫過於外掛全家桶迎來了一位重磅級新成員:RateLimiterPlugin(流控外掛)。
流控,在很多場景下是一項剛性需求。目前市面上所見的絕大多數流控方案都是 QPS 維度的,即限制單位時間內的請求/響應次數。而 smart-socket 本次釋出的流控外掛卻比較與眾不同,我們提供的是針對位元組碼的流量控制能力,實現了網路上下行流量的限速。
產生出研發流控外掛的想法緣於一次線上故障,當時某個業務的網路 IO 流量劇增,消耗了過多資源以致其他請求出現嚴重超時。由此使我意識到基於 QPS 限流策略的侷限性,不僅僅是高併發會衝擊系統的穩定性,低併發高流量也是個不容忽視的存在。尤其在分散式環境下,單節點的故障會引發一系列連鎖反應。而要防止個別網路通道無節制的消耗 IO 資源,則需要將流量限速在安全範圍內。
流控功能的實現原理是透過代理技術攔截了 Java 通訊物件 AsynchronousSocketChannel 的 read/write 方法,識別出超負荷的 IO 任務並延遲至一下個視窗期執行(具體實現參見倉庫原始碼)。
啟用該外掛延續著 smart-socket 外掛一貫的開箱即用的風格,只需在構造方法中指定 read 和 write 的流控值(單位:byte),輸入 0 表示不限流。
processor.addPlugin(new RateLimiterPlugin<>(1024 * 1024, 1024 * 1024))
執行效果如下圖:(10個客戶端傳送訊息,每隔5秒鐘列印一次)
完整示例程式碼 RateLimiterDemo 可從 smart-socket 倉庫中獲取。
更新內容
- 最佳化 WriteBuffer#write 演算法。
- 調整底層IO排程執行緒名。
- 移除底層預設的 tcoNoDelay 設定。
- 新增流控外掛:RateLimiterPlugin。
maven座標
<dependency>
<groupId>org.smartboot.socketgroupId>
<artifactId>aio-coreartifactId>
<version>1.5.13version>
dependency>
最後
開源不易,若覺得該專案還不錯,請為它點個 Star 。倉庫地址:https://gitee.com/smartboot/smart-socket