如何选择合适的开发语言?
- 系统级编程语言,诸如汇编、C、C++
- 这种编程语言执行效率快,并发量也比较高,作为编写网络服务的第一语言,一台服务器就能支撑许多人。缺点是开发效率不够高,需要几年以上经验的程序员才能搞定。
- 专门为网络服务器开发的语言,诸如 Go、Erlang
- 这种语言编写高并发和开发效率都不是问题,有很好的折中效果。缺点就是语言比较新,有许多的坑等着后来的程序员去填,而且语言、语法等系统机制要随着进一步的发展才能稳定下来。
- 解释型脚本语言,诸如 Python、Ruby。
- 这类语言的开发效率非常高效,在现在的服务器硬件上,也能支撑不少用户,但是唯一的缺点是,运行效率低下。虽然也有解决方案,但仍然不能对抗高性能的系统编程语言和专业网络开发的语言。如何选择一种合适的语言来编写网络服务?
网络服务
- Web 服务
- Socket 服务
- 混合模式
如何定制合适的开发协议?
一种客户端和服务器端的网络沟通协议(Protocol)。
三种最流行的开发协议
- XML
- PULL 方式:专门为安卓设备解析 XML 文件设计的解析方式
- SAX 方式:SAX(Simple API for XML)采用事件驱动型方式
- DOM 方式:DOM(Document Object Model)是最传统的解析方式
- JSON
- ProtoBuf
- Google Protocol Buffer
- ProtoBuf 适合用作数据存储或 RPC 数据交换格式,缺点是保存比较麻烦,但是总体来讲还是比较方便的
自己定义协议
自己定义协议包需要考虑完整性和安全性。
1 | [协议头][协议体][协议结尾分隔符] |
接收方需要知道协议的长度,或者知道协议的尾部在哪里,就可以保证协议包的完整性。
1 | [协议长度2字节][协议体] |
而最直接的给协议包加密,就可以保证安全性。
1 | [协议长度2字节][加密协议体] |
不可忽视的多线程及并发问题
并发
是单个 CPU 之间切换多线程任务的操作并行
是多个 CPU 同时分配和运行多线程任务的操作线程
是进程内的独立任务单元,但是共享这个进程的所有资源
如何判断心跳包是否离线?
- 判断非阻塞模型的网络是否断开,可以使用心跳包和计算超时的方式进行断开操作,比如 30 秒没收到心跳包,则可以强制关闭 Socket 句柄断开。
- 心跳包是一种服务器之间交互的方法,也可以用作服务器数据调试和回滚的策略方案。
- 心跳包有两种策略
- 第一种就是运算时间 A 和心跳时间 B 相对固定
- 第二种策略是运算时间 A 和心跳时间 B 是实时调整
CPU 的负载很高的时候用策略一,CPU 负载并不是那么严重的情况下,策略二是比较好的选择。
如何用网关服务器进行负载均衡?
两种常用的负载均衡技术
软件模式
LVS、Nginx、HAProxy。
- LVS 是四层负载均衡,根据目标地址和端口选择内部服务器
- Nginx 这种负载均衡工具是七层负载均衡
- 而 HAProxy 同时支持四层、七层负载均衡,还可以根据报文内容选择内部服务器
因此,LVS 分发路径优于 Nginx 和 HAProxy,性能上也要高些。但 Nginx 和 HAProxy 则更具配置性,比如说可以用来做动静分离。
所谓动静分离,就是根据请求协议的特征,去选择静态资源服务器还是应用服务器。
硬件模式
其中,硬件模式用得比较多的是 F5。
F5 是 F5 Networks 公司提供的一个负载均衡器专用设备, F5 BIG-IP LTM 的官方名称叫本地流量管理器,可以做 4~7 层负载均衡,具有负载均衡、应用交换、会话交换、状态监控等等全备的强大网络功能。
F5 硬件负载均衡的优点是,负载均衡能直接通过智能交换机实现, 处理能力更强,与操作系统无关,负载性能强,适用于一大堆设备、大访问量,其缺点也是很明显的,那就是购买成本高,设备的配置冗余,有些用不上的都给默认配置了。
另外,由于设备只有单个,所以单个负载均衡配置无法有效掌握所有服务器及应用状态。硬件的负载均衡,是从网络层来判断负载规则,所以有时候软件的系统处理能力出现问题,网络硬件还可以作出负载的动作。
网关服务器有哪些功能?
- 中转功能
- 负载均衡
如何制作游戏内容保存和缓存处理?
Redis 不仅是内存缓存
Redis 是一种 key-value
型的存储系统。它支持存储的 value 类型很多,包括字符串、链表、集合、有序集合和哈希类型。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都具有原子性。
- Redis 不仅仅可以用作普通的缓存机制使用,也可以当作正常的数据库使用,Redis 也支持主从同步,要按照应用场景不同来配置不同的 Redis 使用场景。
- 缓存机制不仅仅针对读取游戏保存文件这么一种方案,也可以用作各种数据文件的读取和写入操作。
- 使用现成的 Redis 等缓存数据软件,是一个好的方案。
而设计好的框架、好的缓存机制、好的网络模型,是一款好网游必不可少的条件。
参考:从0开始学游戏开发