游戏服务器设计(golang)

背景

  1. 使用goroutine 轻轻松松高并发
  2. 使用nats互连所有server进程,所有消息通过nats中转
  3. 可扩展:升级nats集群,实现全区全服,动态负载

gated

  1. 处理客户端连接、交互的服务器
  2. 每一个session分配一个goroutine
  3. 可以部署多个进程,客户端随机连接其中一个(或者加一个动态负载,控制客户端连接哪个gated)
  4. 与游戏项目无关
  5. 连接加一个握手策略,防止ddos攻击

gameserver(type1 — typeN)

  1. 按具体游戏内容功能区分不同的server类型,如登录、普通逻辑、地图逻辑、联盟逻辑,各自实现不同的gameserver
  2. 可根据server不同选择合适的goroutine策略,如下有两种策略:
  • 每个roleid分配一个goroutine执行逻辑
  • 定义一组goroutine,将roleid哈希一下,分配到固定的goroutine执行逻辑

logserver

  1. 记录日志,与游戏项目无关
  2. 与各个server直连,提高效率

DB

dbproxy + redis + mysql,实现数据集群模式

  1. 对于开发者,只与dbproxy交互,写数据/读数据都是调用dbproxy接口
  2. dbproxy根据请求,将roleid哈希一个值,根据hash值丢到一个redis,读/写redis数据
  3. redis将数据写入mysql,持久化存储
    注意点:
  • dbproxy使用的是豌豆荚的一个redis集群方案Codis
  • dbproxy 最后执行写操作时,是使用mset,对于一个mset是原子操作,同时成功或者同时失败,但是一批mset,会存在部分失败,部分成功的可能。可以考虑在执行一批mset前,读出数据,然后当某一个mset失败后,将写成功的数据回滚

你可能感兴趣的:(服务器)