不仅仅是百万级TCP长连接框架 t-io
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
- 测试步骤及结果
- 运行org.tio.http.server.demo1.HttpServerDemo1Starter.java
- 测试脚本及测试结果见图,大家应该都看得懂,也欢迎大家下载更换参数进行测试
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
不仅仅是百万级TCP长连接框架 t-io的更多相关文章
- 百万级 TCP 长连接即时通讯框架 t-io
原文:http://www.t-io.org:9292/ https://www.oschina.net/p/t-io
- 知乎千万级高性能长连接网关 https://zhuanlan.zhihu.com/p/66807833
知乎千万级高性能长连接网关揭秘 9 天前 · 来自专栏 知乎技术专栏 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背 ...
- Http 和TCP的关系,TCP长连接和短连接有什么区别?
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...
- TCP 长连接与短连接的区别
TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...
- TCP长连接与短连接
1.概念区别 所谓TCP短连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接.也就是说TCP连接维持的时间比较短.一般银行网页数据交互都使用短连接.再比如说htt ...
- TCP长连接与短连接的区别
http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...
- 多进程解决datasnap支持的tcp长连接数量少的问题
对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000 ...
- TCP长连接与短连接的原理及区别
一.当网络通信时采用TCP协议时: 1.过程: 第一步:(在真正的读写操作之前)Server 和Client 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...
- [转载] TCP长连接与短连接的区别
转载自http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前 ...
随机推荐
- 辨异 —— 行星 vs 恒星
star:恒星,planet:行星: 1. 恒星 恒星是指宇宙中靠核聚变产生的能量而自身能发热发光的星体(比如太阳).过去天文学家以为恒星的位置是永恒不变的,以此为名.但事实上,恒星也会按照一定的轨迹 ...
- SQLite从Excel文件中导入数据
元数据 另存为.csv格式 用记事本打开 打开后的数据 Android客户端开发的时候使用了SQLite数据库,为了测试,需要将一些excel文件中的数据导入到数据库的表中,下面是几个步骤: 数据库表 ...
- sqlserver中获取最后一个字符所在的位置
CHARINDEX('字符',reverse(字段名称)) 这个意思就是将字段进行反转,就是从后往前取,这样就能够获取一个字符最后所在的位置
- python 判断一个数为?
1. 判断一个变量是否数字(整数.浮点数)? instance('a', (int, long, float)) True isinstance('a', (int, long, float)) Fa ...
- c语言学习笔记(12)——补码
补码 编码 在计算机中存储数据的方式 原码 也叫 符号--绝对值码 最高位0表示正 1表示负, 其余二进制位是该数字的绝对值的二进制位 如 5 ---- 00000101 -5 ---- 1111 ...
- GameBuilder见缝插针游戏开发系列(AA)
今天推出了一款游戏叫<AA>.在最近IOS只是弹出一个游戏.非常心脏的孩子,但有很多乐趣.今天,我们谈论它tangide(GameBuilderV2.0)用控件UICanvas实现它. 在 ...
- Qt Installer Framework 3.0.1 Released(功能比较强)
We are happy to announce the release of Qt IFW 3.0.1. 3.0.1 is fully compatible with 2.0.5, which me ...
- Golang写https服务端
1. 生成私钥openssl genrsa -out key.pem 20482. 生成证书openssl req -new -x509 -key key.pem -out cert.pem -day ...
- WPF特效-鱼游动动画3
原文:WPF特效-鱼游动动画3 WPF不支持骨骼,故使用3DMax导出了序列模型文件(.mtl;.obj). 方法1: 使用Blend 2013打开所有obj文件,拖动排列一下即可在usercontr ...
- WPF 4 开发Windows 7 跳转列表(JumpList)
原文:WPF 4 开发Windows 7 跳转列表(JumpList) 在之前写过的<Windows 7 任务栏开发系列>中我们通过Visual Studio 2008 借助微软 ...