# 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@2.13.1: monitoring & maintenance

## 系统环境

Win64 Server/Linux64

## Redis

### 命名空间

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

## Zookeeper

- /<root> 为根, <root> 指示了系统的命名空间
	- /<root>/conf 为配置信息,为系统运行之前输入信息
		- /<root>/conf/servers/redis 为 redis 配置信息
		- /<root>/conf/servers/login 为 login 服务器地址信息
		- /<root>/conf/servers/event 为事件服务器地址信息
		- /<root>/conf/servers/mq	   为消息队列地址信息
        - /<root>/conf/<conf-name>   系统需要的配置
        - /<root>/conf/kv            json 字符串格式的键值对
        
	- /<root>/app 为进程自注册信息
		- /<root>/app/agents[x] 为agent服务启动后自注册信息.包含
			- ip: 172.18.0.33
			- port:21806
			- enabled:true  // 修改为 false 将导致此 agent 离线,所有连接断开之后自动退出
		- /<root>/app/lobbies[procId] //为大厅自注册信息
			- ip: 172.168.0.55
			- port: 21334
			- enabled:true // 同上			
		- /<root>/app/logics[procId] // 为逻辑服务器自注册信息
			- ip: 172.18.0.66
			- port: 23222
			- enabled: true // 同上
        - /<root>/app/http 为 manager 子注册信息
## Nats

作为整个系统的 Event Bus

## Nats-Streaming-Server

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

### 分类

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

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

### 数据结构组成

事件都包含

```json
{
    "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 文件至少包含：
- namespace: 对应 <root> 表示实例工作所在的名字空间
- zookeeper 地址
- logicId 保证全局内唯一

### 配置文件详细:

所有配置都包含 进程ID, zookeeper 配置,日志等级,运行等级
几乎所有都包含监听地址.

端口规则:

- login(): 5100-5200
- agent(200): 服务端口为7100 - 7300: 3跳,分别 +1 为对应的 rpc 地址, +2 为对应的 pprof 地址
- lobby(1): 服务端口为 7500- 7800: 3跳,同上
- manager(5): 服务端口为 10000 - 10300: 3 跳, +1 保留, +2 为 pprof
- wallet(168): 服务端口为 7900 - 8200: 3 跳
- zookeeper: 6100 - 6200
- nats: 6300 - 6400
- redis: 6500 - 6600
- mysql: 6700 - 6800
- others: 20000- 21000

## 监控关键数据

- All
  - mem, cpu, disk, network
  - warn log total
  - error log total
- Agent
  - login request total (faile/success)
  - 连接数 counter
  - 上下行流量
- Lobby
  - enter game total (failed/success)
  - leave game total (failed/success)
  - game playing costs (time & chip)
  - bind-phone times/money (failed/success)
  - tasks reward times/money
  - alms times/money
- Manager
  - vip level up times/money
  - recharge times/money
  - withdraw times/money
  - manager add money times/money
  
## 版本历史

_2019-08-31 v0.1_

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

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