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实现系统架构