直播平台 im 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 -...

21
直播平台 IM 系统实战 张皓聪

Upload: others

Post on 25-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

直播平台 IM 系统实战张皓聪

Page 2: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

1.0 需求

- 一周出 Demo

- 还要差不多能用

- 给老板演示的时候不要突然崩溃

- 万一崩溃了最好不要被发现

- 性能无所谓

- 总之就是要快点做出来

Page 3: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

1.0 架构

WebSocketNode.js

HTTPPHP

ClientsiOS / Android / H5

Page 4: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

前端服务器

- 也叫接入服务器

- 使用 WebSocket 长连

- 使用 pm2守护进程

- 使用组的形式管理连接

- 负责业务

- 用户信息和登录

- 房间在线列表和聊天信息推送

- PHP 推送

ws_server

http_server

pm2

group_list

Page 5: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

向组推送消息

r:10000

r:10001

u:20000

u:20001

20000

20001

gid

20000

20001

broadcast('r:10001', 'Hello');

broadcast('u:20001', 'Hi');

房间

私信

r:0

20000

20001

uid

20003

broadcast('r:0', '公告');

全服

PHP

Client

Page 6: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

2.0 需求

- 这是一个内测版本

- 支持扩容

- 需要更高的可用性

- 礼物信息要比聊天优先级高

- 特定消息要发送回执

Page 7: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

2.0 架构

WSNode.js

LBNode.js

HTTPPHP

ClientsiOS / Android / H5

PubRedis

APINode.js

CacheRedis

WSNode.js

Page 8: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

- 使用 Redis 保存在线列表

以便跨进程 / 主机共享

- 增加了广播订阅器,用于接收推送

- 增加了广播优先级,确保礼物信息优先到

前端服务器

ws_server

http_server

pm2

group_list

redis_client sub_client

Page 9: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

带有优先级的推送消息

r:10000._

r:10000.n

redis

broadcast('r:10001._', 'Hello');

broadcast('r:10001.n', 'Gift');

聊天

送礼

20000

20001

uid

20003

r:10001._

r:10001.n

r:10000._

r:10000.n

gid

r:10000._

r:10000.n

gid20004

20005

uid

20006

WS-1

WS-2

PHP Client

subscribe(...)

subscribe(...)

Page 10: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

3.0 需求

- 业务逻辑越来越多,需要拆分

- 需要支持热更

- 更好的广播性能

- 优化与其他服务通信

- 日志系统

- 部署脚本

Page 11: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

3.0 版本架构

LB WSWS

State Room User

BroadcastIM Monitor

API

PHP

Log

ClientsiOS / Android

WS

StorageDB / Cache

Bot Bad word

RPC

WS

Page 12: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

RPC 服务框架

- 使用 ZeroMQ 的 Dealer 和 Router

- 数据交换格式使是 JSON

- 负载均衡

- 支持热更

- 方便调试

- 很多语言绑定

ClientNode.js

dealer

ClientPHP

dealer

ClientPython

dealer

WorkerNode.js

router

WorkerPHP

router

WorkerPython

router

Page 13: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

广播服务

- 使用 ZeroMQ 的 Pub 和 Sub

- 广播逻辑和业务是绑定的不需要广播的业务就不用起 Pub

- 定期向监控服务器 ping

WS

sub

WS

sub

WS

sub

IM

pub

Room

pub

Broadcast

pub

subscribe publish

Page 14: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

通过 RPC 中转的推送消息

WS-1 PHP

Room

broadcast('r:10001._', 'Hello');

pub

20000

20001

uid

20003

r:10000._

r:10000.n

gid

r:10000._

r:10000.n

gid20004

20005

uid

20006

WS-2

WS-1

subscribe

Page 15: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

ZeroMQ 性能

- E5-2630,8G 内存,千兆网卡的测试结果

# local_thr tcp://*:5555 100 10000000

message size: 100 [B]

message count: 10000000

mean throughput: 1097051 [msg/s]

mean throughput: 877.641 [Mb/s]

Page 16: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

4.0 需求

- 广播和业务分离

- 优化 RPC 协议

- 针对个别地区网络优化

Page 17: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

4.0 架构

WS

Services

Clients电信

StorageDB / Cache

Clients移动

Clients联通

WSproxied

LBproxied

PHP

Pubdistributed

RPC

Router

Page 18: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

RPC 服务路由

- 客户端不必知道每个 Worker 的地址

- 由 Broker 负责统一转发请求

- Worker 的种类,数量也可以随意增减

ClientNode.js

dealer

ClientPHP

dealer

ClientPython

dealer

Broker

router

dealer

WorkerNode.js

router

WorkerPHP

router

WorkerPython

router

Page 19: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

广播服务集群

- 基于 ZeroMQ

- 分别用到了 push, pull, pub, sub 等模式

- 支持动态扩容

- 新的 Node Manager

pub-client

push sub

pub-client

push sub

pub-server pub-server

pubpull pubpullNode

ManagerRPC

sub-clientws

sub-clientws

sub sub

subscribe publish

push push

Page 20: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

基于广播集群的消息推送

WS-1 PHP

Broker

broadcast('r:10001._', 'Hello');

20000

20001

uid

20003

r:10000._

r:10000.n

gid

r:10000._

r:10000.n

gid20004

20005

uid

20006

WS-2

WS-1

Room

pub-server

pub-server

Page 21: 直播平台 IM 系统实战 · 2017. 10. 30. · 前端服务器 - 也叫接入服务器 - 使用WebSocket 长连 - 使用pm2守护进程 - 使用组的形式管理连接 - 负责业务

Q & A