t-io: 不僅僅是百萬級TCP長連接框架
- t-io是基於jdk aio實現的易學易用、穩定、性能強悍、將多線程運用到極致、內置功能豐富的即時通訊框架(廣義上的即時通訊,並非指im),字母 t 寓意talent。
- 同類型的框架還有voovan、netty、mina、baseio等,不喜歡t-io的可以去嘗試了解這幾個,t-io對所有人按LGPL協議開源,但只服務於品行良好的開發人員!
- t-io在協議生態全面建立起來前,更多的是適合私有協議TCP連接項目,所以如果你想實現一個復雜的公有協議的產品,可以用協議生態更為完整的其它類似框架。
t-io誕生的意義
- 舊時王謝堂前燕,飛入尋常百姓家----當年那些王謝貴族們才擁有的"百萬級TCP長連接"應用,將因為t-io的誕生,紛紛飛入普通的個人屋檐下。
常見應用場景
- IM(官方提供了im例子,含web端)
- 實時監控
- 推送服務(已內置API)
- RPC
- 游戲
- 物聯網(已有很多案例)
- 其它實時通訊類型的場景,不一一列舉
用t-io和layim做的web im
maven坐標
org.t-io tio-core 1.7.1.v20170703-RELEASE
t-io特點
極簡潔、清晰、易懂的API
- 沒有生澀難懂的新概念,原生態bytebuffer既減少學習成本,又減少各種中間對象的創建
- 只需花上30分鍾學習helloworld,就能較好地掌握並實現一個性能極好的即時通訊應用
極震撼的性能
- 單機輕松支持百萬級tcp長連接,徹底甩開業界C1000K煩惱;
- 最高時,每秒可以收發500萬條業務消息,約165M(1.6.9版本數據,想驗證的,后面有驗證步驟,1.7.1版本的im由於加入了許多業務功能,所以不能用於測試框架性能)
對開發人員極體貼的內置功能
- 內置心跳檢測
- 內置心跳發送
- 各種便捷的綁定API
- 各種便捷的發送API
- 一行代碼擁有自動重連功能
- 各項消息統計等功能,全部一鍵內置搞定,省卻各種煩惱
鳥瞰t-io
各種傳送門
- t-io生態圈建設
- t-io + layim + vue + ivivew + webpack + google-protobuf開發的web im(服務器由某公司免費提供,只有2M帶寬,最近被Ddos攻擊,所以隨時都可能暫停而導致你訪問失敗)
- 官 網
- 代碼托管平台碼雲
- 開源中國收錄地址
-
其它小伙伴寫的零碎文章和作品
- 給jfinal寫的t-io插件----小徐同學花10分鍾完成的作品
- 用t-io實現的簡單rpc----僅作思路參考,部分實現待完善
- jfinal + t-io完成的im項目----作者天蓬小豬正在完善
性能測試步驟
測試單機吞吐量(實際上就是非網絡環境啦)
- 機器准備
- CPU: i7 6700 / i7 4790
- 內存:8G/4G
- 操作系統:windows7/windows10
- 說明:客戶機和服務器位於同一台機器
- 測試步驟
- 參數調優:修改t-io\dist\examples\im\client\startup.bat,把-Dtio.default.read.buffer.size的值換成4096
- 參數調優:修改t-io\dist\examples\im\server\startup.bat,把-Dtio.default.read.buffer.size的值換成4096
- 雙擊 "bin/start-im-server.bat" 啟動im server
- 雙擊 "bin/start-im-client.bat" 啟動im client
- 保持下圖參數進行測試(強調:你需要多試幾次,前面幾次的性能數據是最差的,貌似跟線程池的預熱有關系,有研究的朋友可以交流一下)
- 測試結果
- 500萬條/秒約165M----此數據系網友提供(i7 6700 + 固態硬盤 + win10)
- 333萬條/秒約97M----此數據系本人親測數據(i7 4790 + 固態硬盤 + win7),測試參數與上圖略有差別,不一一說明
- 測試說明
- 數據中的消息條數指的是業務包,不是指tcp的交互次數,了解tcp協議的人知道,tcp是雙向確認可靠的傳輸協議,對業務而言,其實並不關心tcp了多少次,而是我們的業務數據收發了多少條。
- 請用t-io 1.6.9分支進行測試,1.7.0加了鏈路行為跟蹤功能、1.7.1會加上ip防黑功能,這些功能會使t-io框架本身的性能降低(就像操作系統一個開了防火牆,一個沒開防火牆,性能不是一個級別的)。作為一個io框架,其實並不需要實現這些功能,但是為了讓業務層更舒服,t-io還是舍棄了亮眼的性能數據去擁抱更實用的業務層功能。
- netty是一個知名度極高的一個框架,而且功能更多,t-io如果滿足不了你或不是你的菜,可以嘗試netty
測試centos下可以支持多少長連接數
- 機器准備
- 服務器一台:centos6.x, 虛擬機,一個4核E5 CPU,內存16G
- 客戶機11台:windows,硬件沒什么特別要求,能跑起1.62萬個長連接,配置不低得離譜就行
-
測試步驟
- 修改centos操作系統參數,使之支持更大的長連接數,細節略(可百度之)
- 在centos上運行 "bin/start-im-server.sh" 啟動im server
-
修改dist\examples\im\client\config\app.conf,參考下面的值,注意把server指向centos的ip
#服務器 server=127.0.0.1 #服務器port port=9321 #連接多少個連接到服務器 client.count=16200 #進入到哪個組 group=g #聊天消息發的內容 chat.content=he #一次發多少條(這個數字不要太大) send.count=1
-
把dist\examples\im\client拷到各客戶機並運行"bin/start-im-client.bat"
-
測試結果
- 11個客戶機 ,每個客戶機連16200個TCP連接,服務器一共承受17.82萬TCP長連接,服務器內存只消耗800M,CPU使用率極低(其中有一台客戶擔任破壞性測試機)
- 根據測試結果初步推測:樂觀點:t-io支持200萬長連接沒什么問題,保守點:100萬吧,各位有條件的可以測測,畢竟推測的數據有時候會讓人跌眼境。
-
測試說明
- 因為這17.82萬長連接位於同一個組中,你用客戶機發一條消息,服務器就要推送17.82萬條數據,所以在發消息時,請慎重,當然如果你非要把內存、CPU耗光,然后看t-io宕機才高興,只能說t-io不是你的菜,你還是另請高明吧。
- 這些數據是1.6.9版本測出來的,1.7.0加了鏈路行為跟蹤功能、1.7.1會加上ip防黑功能,這些功能的增加對tcp長連接個數沒什么影響,但是可能內存會增加一些,畢竟多了不少維護數據。
- 不管怎么說,用在生產環境,不管用什么框架,都是要自己測一遍的,有問題可以隨時找作者,不接受惡意找茬,同時作為開源免費軟件,作者也有權拒絕一切服務,這點請知悉----開源,只是把代碼本身按照某種協議貢獻出來,並無義務給你服務,你用得不爽,請另請高明。
- netty是一個知名度極高的一個框架,而且功能更多,t-io如果滿足不了你或不是你的菜,可以嘗試netty
ab test
- 機器准備
- 服務器一台:windows7 ssd i7-4790
- 測試步驟及結果
t-io學習步驟(供參考,具體步驟根據各人而異)
學習t-io的最好方式,是從helloworld的例子入手,順瓜摸藤閱讀t-io的源代碼,已經有很多人閱讀過t-io的源代碼,譬如j-net的作者、hutool的作者、天蓬小豬、守護天使,並且反饋良好,源代碼畢竟只有3000多行,讀讀無妨!如果懶於閱讀代碼,就按照下面的步驟來學習吧!
初步認識t-io
- 安裝1.7以上版本的jdk及maven(已安裝的略過此步驟)
- 從https://git.oschina.net/tywo45/t-io處下載源代碼(已下載的略過此步驟)
- 雙擊 "bin/start-im-server.bat" 啟動im server
- 雙擊 "bin/start-im-client.bat" 啟動im client
- 對着界面把玩幾下,測試一把性能數據,對t-io形成感性認識(注意:好的性能數據需要預熱幾把,讓線程池活起來)
了解代碼目錄結構
所有工程都是maven工程,后續目錄有可能稍有變動,不定期更新
├─bin----------------腳本目錄(方便快速操作)
│ clean.bat----------------清空所有工程的target目錄 │ clean.sh │ deploy.bat----------------作者用來發布到maven中心倉庫的腳本,放出來主要是供大家參考 │ deploy.sh │ dist-examples.bat----------------把所有的例子打包到dist目錄,方便用戶直接執行 │ dist-examples.sh │ install.bat----------------安裝工程到本地倉庫 │ install.sh | start-http-server.bat----------------啟動tio-httpserver │ start-helloworld-client.bat----------------啟動helloworld的客戶端 │ start-helloworld-client.sh │ start-helloworld-server.bat----------------啟動helloworld的服務端 │ start-helloworld-server.sh │ start-im-client.bat----------------啟動im的客戶端 │ start-im-client.sh │ start-im-server.bat----------------啟動im的服務端 │ start-im-server.sh │ start-showcase-client.bat----------------啟動showcase的客戶端 │ start-showcase-client.sh │ start-showcase-server.bat----------------啟動showcase的服務端 │ start-showcase-server.sh ├─docs │ │ │ ├─blog----------------本人博客草稿(大部分博客是在線編輯,所以此處就沒有了) │ │ │ ├─performance----------------一些性能測試截圖(隨着版本的增多,有些截圖已經過時,但仍保留) │ │ │ ├─release----------------新版本發布時的log │ ├─dist----------------成品 │ └─examples----------------用t-io寫的例子成品 │ ├─helloworld │ │ ├─client----------------helloworld的客戶端 │ │ └─server----------------helloworld的服務端 │ ├─im │ │ ├─client----------------im的客戶端 │ │ └─server----------------im的服務端 │ └─showcase │ ├─client----------------showcase的客戶端 │ └─server----------------showcase的服務端 └─src ├─core----------------t-io的核心代碼 ├─zoo----------------t-io的生態圈 │ ├─http----------------用t-io實現的http服務器 │ ├─websocket----------------用t-io實現的websocket服務器 ├─example----------------用t-io寫的例子的源代碼 │ ├─parent----------------例子的maven parent │ ├─helloworld----------------helloworld的源代碼 │ │ ├─client │ │ ├─common │ │ └─server │ ├─im----------------im的源代碼 │ │ ├─client │ │ ├─common │ │ └─server │ └─showcase----------------showcase的源代碼,這個例子是為了幫助用戶學習t-io專門寫的 │ ├─client │ ├─common │ └─server └─parent----------------maven工程的parent
導入t-io官方提供的例子
去t-io碼雲托管地址下載源代碼及例子,里面的showcase例子是專門為學習t-io而寫的,其設計也是准生產級別的,可以直接拿來做您項目的手腳架。下載完成后,請按下面步驟導入到eclipse中
學習萬能的helloworld例子
花30分鍾看一下t-io官方提供的helloworld,了解一下TCP編程的大概流程,文檔傳送門: t-io的hello world
學習用於進階的showcase例子
showcase一詞是從springside借來的,放這很應景,天蓬元帥就是這樣學習的,可以和他交流,他后面會出詳細的教程。
列一下作者本人用過的國產開源軟件
網上很多人對國產開源的印象還停留在n年前,此處列一下作者本人一直在用的部分國產開源軟件,其中有的是有爭議的,也有暴過漏洞的,但是我們想一下struts、netty、mongodb這些國外知名軟件不也暴過嚴重漏洞嗎?
- https://www.oschina.net/p/weixin-java-tools-new (使用一年)
- http://layim.layui.com(2017年5月11號開始使用)
- https://www.oschina.net/p/ztree (使用五年以上吧)
- https://www.oschina.net/p/echarts (使用兩年以上吧)
- http://git.oschina.net/tywo45/talent-validate (使用十年了,開源出來有五年以上吧,原來是博客開源,現在移到開源中國了)
- https://www.oschina.net/p/hutool(懶 人必備,強烈推薦,使用兩個月)
- https://www.oschina.net/p/t-io(使用五年了,開源出來半年)
- https://www.oschina.net/p/druid(使用三年以上吧)
- https://www.oschina.net/p/dubbo(使用兩年)
- https://git.oschina.net/jfinal/jfinal-weixin(使用一年左右)
- https://www.oschina.net/p/fastjson(使用三年以上)
http://www.oschina.net/p/t-io