最近关于网关的设计有不少思考,整理记录下一些想法。
负载均衡
- 随机法,客户端随机选择一个,实现简单,分布可能不均,需要找个比较好的随机算法。
- 随机法+询问机制,随机法的一个补充,当某个网关实例负载过重的时候,与客户端协调连接其他的实例。
- id或ip静态划分 实现简单,问题同随机法,可能不均
- 动态拉取 选择网关之前,先发起一个http请求负载最低的网关。
以上的每种做法多多少少都会有一些变种和优化,可以结合具体项目综合考虑
协议选择
- tcp 从头撸难度较大,而且可靠性和稳定性,对人员要求较高,幸运的是,目前业界一些高性能的库比较多,很少需要重复造轮子(修炼内功除外),对于非fps和moba这种对于网络比较敏感的游戏,大部分游戏都推荐使用
- udp 性能好,但是无序且不可靠,需要实现可靠性和时序的保证
- websocket h5游戏推荐使用
语言选择
- c/c++ 门槛稍高,开发效率低,性能好
- java 门槛低,轮子多,开发效率高,性能较c/c++ 稍差
- go 门槛低,轮子少,开发效率高,性能好,GC较java还是有较大差距
- erlang 语言小众,稳定性好,可以热更,
安全校验
- ddos(flood,tcp 半连接等)
- 重发
- 篡改
- 窃听