方案01:(分发服)

TCP服务负载均衡 tcp 负载均衡_客户端

1、 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接。
a) 设备与服务器建立连接。
b) 服务器接收到连接请求后,立即将分配好的socket服务器ip与port信息响应给设备。
c) 服务器主动断开socket连接。
2、 设备得到ip与port以后,设备去连接socket服务器,然后与其进行协议通讯。
a) 设备连接到socket服务器。
b) socket服务器响应连接成功响应信息。
c) 设备与socket服务器保持长链接通讯。

  • 若设备未收到连接成功响应则再次尝试连接,若三次请求依旧没有成功建立连接,那么设备需要去请求分发服务器然后再重新上述操作。
  • 当设备在异常情况下链接不上socket服务器时,依旧尝试三次若不能成功,则直接请求分发服务器,然后再重复上述操作。

我们通过这样的方式就可以轻松的解决大量设备与服务器通讯的问题,若后面有更多的设备请求只需添加更多的socket服务器即可。当然可能大家担心分发服务器受不了,其实这是多余的,因为分发服务器只做转发,而且完成处理以后就直接把链接给释放,并且当设备拿到socket服务器的ip地址以后就将不在访问分发服务器了,它的压力是可控的不会特别也不会频繁。

方案02:(http登录服+中央服-存连接信息,做全局转发)

  • 像其它zk、nginx做集群和负载均衡或许都可以,但最大的问题是不能进行全局性的消息转发,引入消息队列的做消息转发的话又得介入多台硬件服务器,投入增加了不少。我的方案类似上面方案01,不过客户端不会首先直连中央服务器,而是会请求无状态的http登录服,由http登录服请求中央服务器分析负载后,将最优的从服务器ip和端口发送给客户端,客户端再连接对应的从服务器,这种方案最大的弊端就是强依赖中央服务器的稳定性。
    我是做游戏后端的,我的设计方案是用来做游戏世界服(全球服)的,希望对你能有帮助。
  • 我也是做游戏的,我们也是用你这种方案做全球服,用户session信息存到redis。发送全局消息的话,引入消息队列是最好的,但是得需要机器支持,如果想省机器的话,可以在中央服对每台已经连上的客户端去群发。用抛事件的方式一样可以实现。

方案03:【以下方案是否还能双向通信???】

nginx的四层代理,stream模块。只要你的后端服务器开启多个,自动帮你做好负载均衡的。
先用nginx 做tcp代理,然后增加个模块(地址模块), 客户端先从地址模块拿到所有ip, 然后再去连接netty服务端

方案04:

haproxy做TCP负载均衡 redis做为服务器存储用户的session或者cookie 。。。

方案05:

如果使用阿里云的话 阿里云slb支持tcp负载 你只需在后端启动几台服务端就行 slb配置转发到后端服务器就行