服务器开发

2020/01/01

如何选择合适的开发语言?

  1. 系统级编程语言,诸如汇编、C、C++
    • 这种编程语言执行效率快,并发量也比较高,作为编写网络服务的第一语言,一台服务器就能支撑许多人。缺点是开发效率不够高,需要几年以上经验的程序员才能搞定。
  2. 专门为网络服务器开发的语言,诸如 Go、Erlang
    • 这种语言编写高并发和开发效率都不是问题,有很好的折中效果。缺点就是语言比较新,有许多的坑等着后来的程序员去填,而且语言、语法等系统机制要随着进一步的发展才能稳定下来。
  3. 解释型脚本语言,诸如 Python、Ruby。
    • 这类语言的开发效率非常高效,在现在的服务器硬件上,也能支撑不少用户,但是唯一的缺点是,运行效率低下。虽然也有解决方案,但仍然不能对抗高性能的系统编程语言和专业网络开发的语言。如何选择一种合适的语言来编写网络服务?

网络服务

  • Web 服务
  • Socket 服务
  • 混合模式

如何定制合适的开发协议?

一种客户端和服务器端的网络沟通协议(Protocol)。

三种最流行的开发协议

  1. XML
    1. PULL 方式:专门为安卓设备解析 XML 文件设计的解析方式
    2. SAX 方式:SAX(Simple API for XML)采用事件驱动型方式
    3. DOM 方式:DOM(Document Object Model)是最传统的解析方式
  2. JSON
  3. ProtoBuf
    1. Google Protocol Buffer
    2. ProtoBuf 适合用作数据存储或 RPC 数据交换格式,缺点是保存比较麻烦,但是总体来讲还是比较方便的

自己定义协议

自己定义协议包需要考虑完整性和安全性。

1
[协议头][协议体][协议结尾分隔符]

接收方需要知道协议的长度,或者知道协议的尾部在哪里,就可以保证协议包的完整性。

1
[协议长度2字节][协议体]

而最直接的给协议包加密,就可以保证安全性。

1
[协议长度2字节][加密协议体]

不可忽视的多线程及并发问题

  1. 并发 是单个 CPU 之间切换多线程任务的操作
  2. 并行 是多个 CPU 同时分配和运行多线程任务的操作
  3. 线程 是进程内的独立任务单元,但是共享这个进程的所有资源

如何判断心跳包是否离线?

  1. 判断非阻塞模型的网络是否断开,可以使用心跳包和计算超时的方式进行断开操作,比如 30 秒没收到心跳包,则可以强制关闭 Socket 句柄断开。
  2. 心跳包是一种服务器之间交互的方法,也可以用作服务器数据调试和回滚的策略方案。
  3. 心跳包有两种策略
    1. 第一种就是运算时间 A 和心跳时间 B 相对固定
    2. 第二种策略是运算时间 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 硬件负载均衡的优点是,负载均衡能直接通过智能交换机实现, 处理能力更强,与操作系统无关,负载性能强,适用于一大堆设备、大访问量,其缺点也是很明显的,那就是购买成本高,设备的配置冗余,有些用不上的都给默认配置了。

另外,由于设备只有单个,所以单个负载均衡配置无法有效掌握所有服务器及应用状态。硬件的负载均衡,是从网络层来判断负载规则,所以有时候软件的系统处理能力出现问题,网络硬件还可以作出负载的动作。

网关服务器有哪些功能?

  1. 中转功能
  2. 负载均衡

如何制作游戏内容保存和缓存处理?

Redis 不仅是内存缓存

Redis 是一种 key-value 型的存储系统。它支持存储的 value 类型很多,包括字符串、链表、集合、有序集合和哈希类型。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都具有原子性。

  • Redis 不仅仅可以用作普通的缓存机制使用,也可以当作正常的数据库使用,Redis 也支持主从同步,要按照应用场景不同来配置不同的 Redis 使用场景。
  • 缓存机制不仅仅针对读取游戏保存文件这么一种方案,也可以用作各种数据文件的读取和写入操作。
  • 使用现成的 Redis 等缓存数据软件,是一个好的方案。
    而设计好的框架、好的缓存机制、好的网络模型,是一款好网游必不可少的条件。

参考:从0开始学游戏开发