场景:

需要websocket服务做实时弹幕接收、推送,如果有大量用户连接就需要使用分布式服务,部署运行多个websocket服务,多个wensocket服务如何保持一致性,并且相互配合提供高性能服务尼?

情景一:多端登录只能保持一端弹幕连接,喜欢看直播的小伙伴能观察到斗鱼直播就是这种模式。

如果用户u1使用iphone连接了弹幕服务W1,又使用小米手机连接了弹幕服务W2,此时需要W2告知W1将弹幕服务断开,这里的处理方式可以有一下几种选择:

  • 1.总是连接同一服务
    在用户连接弹幕服务时总是将同一uid映射到同一个websocket服务,可通过nginx url hash等负载均衡算法实现,需要考虑机器宕机的情况下,在机器宕机、恢复前后映射到了不同机器,不能满足业务场景的需求。可以考虑一致性hash等方法解决此类问题。或者在微服务gateway网关进行服务节点的选取。

  • 2.http接口通信
    在连接弹幕服务时记录Uid对应的websocket服务信息(ip port),在第二次连接时如果需要前一个连接服务断开,通过http服务调用业务处理接口(http://ip:port/api...),以接口通信达成服务间行为一致

  • 3.消息队列mq
    在连接弹幕服务时向各个websocket服务广播消息,各个服务检查自己的连接池中是否有此uid的连接,如果有就断开。

笔者这里使用第二种方式,逻辑比较简单,但是需要考虑服务不可用的情况。

情景二:统计连接数量

实现方式:

  • 1.借助中间件redis,使用同一个key,连接+1,断开-1
  • 2.调用服务接口,统计各个服务连接数之和,定时更新到缓存中。只能统计大概的数量