专业做外贸网站公司,网站开发 原理,wordpress 4.8 php版本,广东网页制作与网站建设最近在开发一个游戏的客服系统#xff0c;同一时间咨询问题的玩家多#xff0c;为了保证服务器高可用#xff0c;需要利用分布式#xff0c;另外服务器宕机还需要玩家无感知重连#xff0c;最关键的一点是如何实现服务器的高扩展性#xff0c;即性能不足时#xff0c;如…最近在开发一个游戏的客服系统同一时间咨询问题的玩家多为了保证服务器高可用需要利用分布式另外服务器宕机还需要玩家无感知重连最关键的一点是如何实现服务器的高扩展性即性能不足时如何以最少的代价增加一台新的服务器。
1.单台websocket
单台消息互传实现十分简单通过websocket中转就可以了不再多加赘述。 2.多台websocket
当客户端不在同一台服务器上时如何实现消息互通 一开始的时候我是想着把server A 与 server B 通过websocket连接起来互发消息这种方案在服务器数量小的时候维护起来也不算麻烦。
例如增加server C 就要把 A、B、C连起来但是每增加一台服务器工作量指数级增长还要考虑到服务器宕机、服务器心跳的各种问题想想都头疼。
3.多台websocket消息推送 这下舒服了。
1.使用全局redis存储客户端与服务端的关系
2.webscoket服务器各自订阅不同的消息队列。
发消息流程
情况一
clientA 给 clientB 发消息时先从缓存中读取clientB在哪个服务器上发现clientA 与clientB 在同一服务器时消息直接发送至clientB
情况二
clientB 给 clientC 发消息时从缓存中读到clientC和clientB并不在同一服务器上例如clientC在wsB那么clientB将消息发送到rabbitmq队列B然后rabbitmq推送到wsBwsB给clientC发送消息。
4.总结
新增服务器只需要多订阅一条消息队列。服务器宕机时客服端重连websocket重新绑定redis的server关系。rabbitmq的ack机制保证消息的可靠性。
5.改进
压缩消息节省带宽。推荐使用google的protobuf就是稳。