# Kingame 重要部分规划

## 系统主要第三方组件

- redis@4.0.11 (cluster):
- mysql@5.7.20 (cluster):
- nats@2.0.2 (cluster):
- nats-streaming-servers@0.16.0 (2-layer cluster): message queue
- zookeeper@3.4.12 (cluster): distribution system helper
- promethues@latest: operation & maintenance

## 系统环境

Win64 Server/Linux64

## Redis

### 命名空间

- conf: 和配置相关的信息
- user: 和用户相关信息
- rt: 运行过程中产生的信息,虽然是运行中信息,但不可直接删除
- map: 映射信息
- tmp: 都不属于以上类别而且可以随时删除无大影响的数据

## Zookeeper

- /kg 为根

  - /kg/conf 为配置信息,为系统运行之前输入信息
    - /kg/conf/servers/redis 为 redis 配置信息
    - /kg/conf/servers/login 为 login 服务器地址信息
    - /kg/conf/servers/event 为事件服务器地址信息
    - /kg/conf/servers/mq 为消息队列地址信息
  - /kg/app 为进程自注册信息
    - /kg/app/agent[x] 为agent服务启动后自注册信息.包含
      - ip: 172.18.0.33
      - port:21806
      - enabled:true // 修改为 false 将导致此 agent 离线,所有连接断开之后自动退出
    - /kg/app/lobby[procId] //为大厅自注册信息
      - ip: 172.168.0.55
      - port: 21334
      - enabled:true // 同上
    - /kg/app/logic[procId] // 为逻辑服务器自注册信息
      - ip: 172.18.0.66
      - port: 23222
      - enabled: true // 同上

## Nats

作为整个系统的 Event Bus

## Nats-Streaming-Server

消费者使用 queue subscribe 的模式工作，进行负载均衡，并一定程度上保证消费者在线

### 分类

用"事件"的角度来看待通道。尽量少的通道数量，来简化下游的处理逻辑

- ev.user. 因为用户的操作所产生的事件，全部划归到这里
- ev.sys. 系统运行过程中，可能和用户操作有一定关系，但"不应该"出现的事件，或应该出现的重要的事件
- ev.mgr. 由后台管理操作所产生的事件

### 数据结构组成

事件都包含

    {
        "id": 1,                // 事件ID，
        "guid": 10000,          // 关联的用户，如果没有，则为0
        "orig": "lobby-10000",  // 产生事件所在的服务器名称
        "ts": 189343900,        // 事件产生的时间戳
        "aux": "debug",         // 事件辅助信息，
        "params":{              // 事件的其他参数，比如用户注册事件，参数是注册信息，和注册成功/失败

        }
    }

### 处理原则

基于以上事件分类规则划分事件所应处于的 subject，但并不意味着对下游处理的任何限定。即可以根据需求任意处理这些消息，保存，报警，置入消息队列其他通道进行二次处理。并不限制，但必须保证对系统无损。

## LogicId:

每个进程都有一个ID,标识一个分布环境中的进程。规则如下：

- 按照功能规划一个代码FuncId，比如 Agent 为 1， Lobby 为 2， 表示主体功能，这个数字上限为999
- CataId: 表示类别，功能的内部细分类别。上限为 99
- SubId: 表示子类别，上限为 99
- InstId: 进程的实例代码，上限为 99

Example:

> Agent 启动， 配置 LogicId 为 001 01 01 01(01010101)(FuncId,CataId,SubId,InstId)再启动一个实例， LogicId 为 001010102。 表示两个进程完全无差别，只是多了一个实例(只有 InstId 不同)。

> Doudizhu 启动，配置 LogicId 为 003 01 01 01 表示 斗地主 初级场 未使用 实例1；再启动一个配置为 LogicId 为 003 02 01 01表示 斗地主 中级场 未使用 实例1；再启动一个 Doudizhu 配置为 003 02 01 02 表示 斗地主 中级场 未使用 负载2，以此类推。

LogicId 表示后台提供服务的每个进程ID，如果这个进程提供游戏逻辑服务，则可用于表示 GameId，设计上和 GameId 无关

## 启动参数

- -c 制定配置文件(json format)

json 文件至少包含：

- zookeeper 地址
- logicId 保证全局内唯一

## 版本历史

2019-08-31 v0.1

lobby : 完成包含 agent 在内的所有逻辑，包含模块：

- agent 考虑实现和调试的简单，把 agent 功能包含进来，目前时间紧迫
- rpc 接受 php 后台的控制命令
- api 和第三方通信
- zookeeper 支持运维层面的高级功能
- eventbus 跨机器跨进程的实时事件总线，用于解耦
- mq 消息队列，用于解耦和整体性能提升
- redis 主要的存储设施，需要事件触发落盘

manager: 为web管理服务提供接口。