第1页
论实时应⽤用开发的『正确』姿势
Rainbow—基于Tornado打造的⻓长连接代理服务器 jeffkit@hoge.cn
第2页
关于@jeff_kit
- 珠三⾓角技术沙⻰龙化⽯石组委 - 连续(未成功 -_|||)创业者 - 厚建云计算⼲⼴广州公司总经理 - 略懂Python,⻓长⼤大后想当全栈多 妻 栖⼯工程师 - PyCon⽼老朋友
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第3页
懒
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第4页
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第5页
关于实时(⻓长连接)应⽤用
智能⼿手机推送 即时聊天 监控仪表板 etc …
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第6页
关于Socket 编程
异步的编程模型 管理⻓长连接的状态 保证消息传输的可靠性
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第7页
不容易
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第8页
寻找最偷懒的开发⽅方式
像HTTP应⽤用那样简单! 客户端:Request/Response模式 服务端:写RESTFUL API 业务逻辑随时更新,不影响⽤用户连接
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第9页
MQTT ?ZeroMQ?
Web
Pub/Sub
Pub/Sub
Mobile
Pub/Sub
MQTT / ZeroMQ
Server
InProc://
Auth Handler
HTTP
BIZ SRV
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第10页
Why not!
编写专有的鉴权系统 Pub/Sub系统所有客户端平等 以致于服务端没有上帝视⾓角 服务端不能控制客户端
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第11页
⼼心中的她...
Web
Req/Rsp
Req/Rsp
Her
Mobile
Connect Close Forward
make client sub/unsub Send to a channel
HTTP
BIZ SRV
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第12页
消息的关键概念
消息类型,类⽐比HTTP的URL 消息内容,类⽐比HTTP的参数
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第13页
基于WebSocket
TCP+,轻 但,完整:⼼心跳,装拆消息包 ⽀支持Web接⼊入 成熟、流⾏行
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第14页
借鉴MQTT的QoS
消息Quality of Service 三个级别 级别 0:最多只发⼀一次,不管是否成功 级别 1:保证⾄至少成功送达⼀一次 级别 2:保证有且只成功送达⼀一次
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第15页
协议格式
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第16页
命令类型
PACKET_SEND PACKET_ACK # for QoS=1 PACKET_REC # for QoS=2 PACKET_REL # for QoS=2 PACKET_COM # for QoS=2
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第17页
站在Tornado的肩膀上
⾯面向⾼高并发的异步IO Socket开发框架 在FriendFeed,Facebook内久经考验 内置WebSocket实现、定时器等
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第18页
她叫Rainbow
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第19页
这样写客户端
Objective-C
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第20页
这样写客户端
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第21页
⽼老湿,整⼀一聊天Demo吧
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第22页
pip install rainbow-server
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第23页
rainbow.ini
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第24页
rainbow-server -f rainbow.ini
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第25页
pip install rainbow-django
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第26页
服务端代码
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第27页
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第28页
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第29页
主要JS代码
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第30页
服务器集群
零配置,内⺴⽹网⾃自动发现机制 TCP Port:1984 - ~ UDP Port:2014 - ~ ⺴⽹网内⽀支持多个独⽴立集群,cluster_name
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第31页
http://rainbow/serverinfo/
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第32页
BenchMark(1G内存单核 )
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第33页
感谢
同事们: 智丰、升爷、亮、理天、Nick 社区伙伴:⽼老潘、邱⽂文武、婷姐@techparty 微信群:⼲⼴广州技术宅饭醉团伙
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第34页
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!
第35页
讨论
北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!