PHP + Swoole 开发消息推送服务--韩天峰
2020-02-27 261浏览
- 1.
- 2.PHP + Swoole 开发消息推送服务 Rango-韩天峰
- 3.关于我 • 新浪微博:http://weibo.com/hantianfeng• Github主⻚页:https://github.com/matyhtf
- 4.消息推送服务器
- 5.虎⽛牙游戏直播
- 6.哪些地⽅方需要推送服务 主播开播 服务器主 了 动控制 主动更新 APP设置 游戏竞猜 结果 即时聊天 新闻推送
- 7.技术选型 • 服务器硬件: RAM 16G + 8核 E5-2620 • 服务器操作系统:Ubuntu 12.10 64位 • 编程语⾔言和框架:PHP + Swoole(扩展+框架) • 存储:Redis + MySQL • 通信协议:TCP + 固定包头 + WUP + JSON (WebSocket+JSON) • 并发连接数:单机同时平均在线20万⽤用户,峰值可达到50万,使⽤用3台 MsgServer,可⽀支持150万⽤用户同时在线 • 分布式系统:架构层⾯面没有任何单点,任意的程序模块均可⽔水平扩容
- 8.系统架构
- 9.GetMsgServerIP • ⼀一个PHP提供的Http接⼝口,客户端会携带设备ID、⽤用户ID等信息请 求此接⼝口 • PHP程序查询Redis,得到当前在线的MsgServer IP列表 • 按照⼀一定的算法,计算出该客户端连接到哪台MsgSever • MsgServer宕机,会⾃自动从Redis中踢出,客户端可以连接到其他 MsgServer
- 10.MsgServer • 与客户端保持连接,ulimit –n 调整为 1000000 • 与ProxyServer保持连接,接收来⾃自其他MsgServer的消息转发 • 检测客户端存活状态,⼼心跳时间为300秒/500秒 • ⼼心跳过快耗电过多,⼼心跳过慢有可能被电信运营商切断连接 • 设备/⽤用户登录退出操作,更新Redis中的状态 • 消息进⾏行双向确认/重传/去重。发送消息后,客户端必须恢复ACK确认包,才认为已 成功。否则进⾏行重传,客户端对服务器推送的消息进⾏行去重,避免收到重复的消息。 • MsgServer发现⽤用户离线,会将消息保存起来,根据类型设置不同的过期时间。 • 设备上线后,尝试推送离线消息
- 11.MsgServer
- 12.ProxyServer • 检测MsgServer的存活状态 • MsgServer没有连接到ProxyServer,认为此消息服务器已下线, ⾃自动从Redis中踢掉 • MsgServer上线后连接到ProxyServer,⾃自动加⼊入Redis • 接受来⾃自PHP代码、C++程序、Java程序的消息推送请求,转发 给⽤用户所在的MsgServer • ⽀支持定时向某些⽤用户发送消息
- 13.ProxyServer
- 14.ProxyServer
- 15.JobServer • 接受运营下发的 ⼲⼴广播/组播任务 • 查询⽤用户和组,打包成单条消息,发给ProxyServer • 定时任务处理 • 其他业务逻辑处理
- 16.JobServer
- 17.配套⼯工具 • 运营管理平台:下发推送任务(PUSH Job),查看⽤用户在线状态, 查看⽤用户消息列表 • ⽇日志查询平台:对某些⽤用户进⾏行染⾊色,查询Access⽇日志/消息⽇日志 • 统计监控平台:统计当天消息发送统计、在线⼈人数统计、监控报警
- 18.配套⼯工具
- 19.配套⼯工具
- 20.配套⼯工具
- 21.配套⼯工具
- 22.开发中遇到的⼀一些坑(1) • Android客户端的Java程序员使⽤用socket.sendUrgentData检测Socket 是否可⽤用,某些路由器节点不⽀支持这种数据包,导致服务器收到的数 据莫名其妙多了1字节 • 不要⽤用PHP做⼤大规模的计算逻辑 • PHP数组内存占⽤用较⼤大,需要对其规模有预估,避免内存爆掉 • 尽量使⽤用PHP局部变量和对象,使⽤用全局变量/类静态变量时要谨慎 • 不要迷信Redis,Redis是单线程,CPU可能会成为瓶颈。可以使⽤用 swoole的task进程/swoole_table来取代⼀一部分Redis的使⽤用
- 23.开发中遇到的⼀一些坑(2) • Redis/MySQL/消息队列使⽤用多实例 • swoole设置CPU亲和性,避开CPU0,使CPU0仅处理⺴⽹网络中断 • 上线后及时加监控和报警,第⼀一时间发现问题
- 24.为什么要⽤用PHP开发? • 从⽴立项、评审、开发、测试、上线,仅⽤用⼀一⼈人⽉月,效率惊⼈人。 • PHP开发调试简单,⼯工程师没有⼼心理负担,更利于产品的迭代、 完善、进化 • PHP程序员在Web⽅方⾯面有绝对优势,强⼤大的后端Server配完美的 Web管理界⾯面
- 25.为什么要⽤用Swoole? • 完整的Server/Client⽅方案,不需要关⼼心⺴⽹网络通信的底层细节 • C语⾔言开发,性能强悍。底层⼏几乎没有任何性能损失,CPU全部被 利⽤用到PHP程序上 • 拥有各种API,如task/table/sendMessage/timer/event,⾮非常灵活 强⼤大 • Swoole有百度地图、腾讯企业QQ等超⼤大型企业在⽤用,更靠谱 • 社区⽀支持⼒力度⼤大,有问题可联系到Swoole作者本⼈人
- 26.Q&A
- 27.• 招聘PHP/IOS/Android程序员,奖励3000元+AppleWatch • 加⼊入我们,⽤用PHP+Swoole实现系统架构