35
论实时应开发的『正确』姿势 Rainbow—基于Tornado打造的连接代理服务器 [email protected]

基于Tornado打造通用长链接代理服务器

Embed Size (px)

Citation preview

论实时应⽤用开发的『正确』姿势Rainbow—基于Tornado打造的⻓长连接代理服务器

[email protected]

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

关于@jeff_kit- 珠三⾓角技术沙⻰龙化⽯石组委

- 连续(未成功 -_|||)创业者

- 厚建云计算⼲⼴广州公司总经理

- 略懂Python,⻓长⼤大后想当全栈多 妻 栖⼯工程师

- PyCon⽼老朋友

2

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

懒3

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

4

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

关于实时(⻓长连接)应⽤用

智能⼿手机推送

即时聊天

监控仪表板

etc …

5

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

关于Socket 编程异步的编程模型

管理⻓长连接的状态

保证消息传输的可靠性

6

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

不容易7

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

寻找最偷懒的开发⽅方式

像HTTP应⽤用那样简单!

客户端:Request/Response模式

服务端:写RESTFUL API

业务逻辑随时更新,不影响⽤用户连接

8

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

9

MQTT ?ZeroMQ?

MQTT / ZeroMQ

Web

Mobile

BIZ SRVServerHTTPPub/Sub

Pub/Sub

Pub/Sub

Auth Handler

InProc://

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

Why not!编写专有的鉴权系统

Pub/Sub系统所有客户端平等

以致于服务端没有上帝视⾓角

服务端不能控制客户端

10

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

⼼心中的她...

11

Her

Web

Mobile

BIZ SRV

Req/Rsp

Req/Rsp

Connect

Close

Forward

make client sub/unsub

Send to a channel

HTTP

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

消息的关键概念

消息类型,类⽐比HTTP的URL

消息内容,类⽐比HTTP的参数

12

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

基于WebSocketTCP+,轻

但,完整:⼼心跳,装拆消息包

⽀支持Web接⼊入

成熟、流⾏行

13

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

借鉴MQTT的QoS消息Quality of Service 三个级别

级别 0:最多只发⼀一次,不管是否成功

级别 1:保证⾄至少成功送达⼀一次

级别 2:保证有且只成功送达⼀一次

14

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

协议格式

15

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

命令类型

PACKET_SEND

PACKET_ACK # for QoS=1

PACKET_REC # for QoS=2

PACKET_REL # for QoS=2

PACKET_COM # for QoS=216

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

站在Tornado的肩膀上⾯面向⾼高并发的异步IO Socket开发框架

在FriendFeed,Facebook内久经考验

内置WebSocket实现、定时器等

17

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

她叫Rainbow

18

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

这样写客户端

19

Objective-C

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

这样写客户端

20

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

⽼老湿,整⼀一聊天Demo吧

21

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

pip install rainbow-server

22

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

rainbow.ini

23

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

rainbow-server -f rainbow.ini

24

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

pip install rainbow-django

25

北京/上海/⼲⼴广州 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!

服务器集群

零配置,内⺴⽹网⾃自动发现机制

TCP Port:1984 - ~

UDP Port:2014 - ~

⺴⽹网内⽀支持多个独⽴立集群,cluster_name

30

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

http://rainbow/serverinfo/

31

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

BenchMark(1G内存单核 )

32

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

感谢

同事们: 智丰、升爷、亮、理天、Nick

社区伙伴:⽼老潘、邱⽂文武、婷姐@techparty

微信群:⼲⼴广州技术宅饭醉团伙

33

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

北京/上海/⼲⼴广州 0xFF Life's pathetic, go Pythonic!

讨论

35