-
Notifications
You must be signed in to change notification settings - Fork 199
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
82 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,56 +1,98 @@ | ||
Welcome to the breeze wiki! | ||
## breeze简述 | ||
[![Build Status](https://travis-ci.org/zsummer/breeze.svg?branch=master)](https://travis-ci.org/zsummer/breeze) | ||
breeze是一个C++的轻量级服务器框架, 适合端游/页游/手游/棋牌/IM的分布式服务器端. | ||
breeze是一个C++的轻量级的分布式服务器引擎, 架构指导思想为一切皆service. | ||
breeze is a lightweight, fast, scalable, distributed server engine. Greatly inspired by docker and Bigworld. the thoughts is " all is service ". | ||
|
||
## 主要依赖模块 | ||
DB使用mysql,通过proto4z根据原生数据结构生成对应的SQL模板并通过接口动态生成直接可以交给mysql服务执行的最终的增删改查SQL语句. | ||
网络模块部分使用zsummerX. | ||
协议解析使用proto4z. | ||
日志模块使用log4z. | ||
|
||
|
||
## 特点: | ||
|
||
总代码量很小 非常轻量级, 可以快速上手使用. | ||
使用C++11标准, 在满足高性能的同时满足快速开发要求. | ||
天然的分布式方案,(架构思想上可以参考skynet,bigworld,gce等), 融合了docker的集装箱思想和bigworld的一切皆实体思想. | ||
网络库使用zsummerX, 可以直接嵌入到移动平台的客户端中, 打通移动客户端到服务端的通讯. | ||
协议为原生的二进制数据流, 支持lua客户端的使用, 性能非常高(相对于json等方案带来的是更小的流量,更快的响应速度). | ||
支持HTTP协议, 可以方便的接入第三方的认证充值平台. | ||
数据采用RC4流式加密, 最小的性能损失和更可靠的加密效果. | ||
- **实现docker和service的核心代码约2000行, 简洁朴素**. | ||
|
||
- 使用C++11标准, 充分发挥shared_ptr,functional, lambda应有的作用, 结合C++异常和模板,**在满足高性能与可靠性的前提下把易用性做到了接近lua这样的脚本语言的水平**. | ||
|
||
- **对开发者透明的分布式方案**, 对业务开发者而言并不需要关心分布式本身, 但通过配置可以很灵活的调整服务器负载. (架构思想上可以参考skynet,bigworld,gce,nf等服务器引擎). | ||
|
||
- 网络库使用zsummerX, **支持全平台**,win/linux/mac/android/ios, 可以直接嵌入到移动平台的客户端中, 打通移动客户端到服务端的通讯, **zsummerX的特性该服务器引擎全部支持**(本来就是为了breeze写的). | ||
|
||
- 协议序列化采用IDL工具生成的方案, 采用的开源库为proto4z. 通过xml配置文件生成**原生的C++,lua,C#数据结构代码**, 支持二进制协议和http协议, 并可以**生成操作mysql的序列化/反序列化代码**. 配合zsummerX可以很方便的在上述语言中混合通讯. | ||
|
||
- 日志库使用log4z. | ||
|
||
- breeze的**理论最大规模为252个docker节点**, 推荐为1-150个节点,具体根据自己需求调整. | ||
|
||
- breeze的单组服务器设计容量在实际项目中, **轻度游戏10~100万同时在线**, 有大量交互的模块和丰富的外围系统的**中度/重度游戏1~10万+在线**(瓶颈在于交互模块的单例service的负载能力, 通过对业务的把握尽量拆分更多的单例service, 转移负载到负载均衡的动态service上可以有效提升和突破这个上限), 数据库注册容量<=1000万(大于这个容量要考虑对数据库进行sharding, 垂直sharding直接根据业务进行分割, 添加更多的数据库service类型和配置即可, 而单表大于1000万需要水平sharding, 这个对dbhelper进行扩展后可以对业务层透明,但暂无需求 并没有去实现. , 另外需要注意减小不需要装载的service的驻留资源, 超规模使用资源不好挥霍的.). | ||
|
||
|
||
|
||
|
||
|
||
## 核心模块介绍 | ||
### docker: | ||
|
||
--- | ||
|
||
docker是用来托管service的专用vm: | ||
> 负责底层的网络通讯,多节点的网络拓扑构建, docker的多节点对上层透明化. | ||
> docker维护service和镜像service的创建,装载,卸载,销毁等管理操作. | ||
> service的负载均衡,容灾等处理. | ||
> 上层只需关注docker所装载的service. | ||
docker的资源消耗: | ||
> docker集群的socket数量开销= (docker个数的平方)*2 | ||
> docker集群的总端口占用数量开销=docker个数的平方 | ||
> 操作系统的可用端口数量小于64k, 也就是docker无法突破的理论上限是252个docker进程. | ||
|
||
### service: | ||
--- | ||
service是breeze引擎的核心结构, 通过包装对docker接口的再次包装, 实现 "all is service" 这一思想. | ||
> 通过简单的toService即可把数据发往另外一个service而不需要关心对方装载在本地还是另外一个docker上. | ||
> 通过sloting方法可以注册当前service可接收的消息类型和对应的处理方法 | ||
> toService可以携带本地回调方法, 对方收到消息后通过backToService返回的消息可以直接在回调中处理. | ||
> 创建一个service只需要集成该基类, 填写对应的onLoad onUnload等方法即可. | ||
> service的依赖关系通过简单的定义即可, docker会自动组织为正确的装载/卸载依赖拓扑图并据此进行装载和卸载等操作. | ||
|
||
## 已实现的部分业务模块 (供参考和上手) | ||
### 登录流程 | ||
--- | ||
已实现多角色账户的登录,创建用户,装载用户service, 切换用户客户端, 踢掉客户端, 卸载用户service, 离线消息, webservice, dbservice等. | ||
|
||
#### cluster版本当前开发进度 | ||
### DBService | ||
直接操作数据库的的service, 每个db一个线程, 每个db对应一个service type. | ||
所有运行中的数据库操作, info,log等 都需要走该service中专. | ||
配合proto4z的mysql序列化方案, 可以一个调用实现增删改查, 而通过ModuleData的模板类, 则实现按照业务模块一键从数据库中load/create/update/insert等同步. | ||
|
||
### UserMgrService | ||
--- | ||
用户中心service, 用于用户service的创建,装载,客户端认证通讯关联等. | ||
也用于玩家管理,特别是离线玩家的管理(在线玩家可以直接server对service进行交互). | ||
|
||
### 引擎已实现WebService | ||
--- | ||
提供web 服务器/客户端相关服务. | ||
通过配置可以在该service中直接处理来自web客户端的请求, 并可以处理来自内部的消息然后向外部发起web请求,并回调给来源(服务器gm后台实时查询管理接口, 向外部发起的渠道认证等需求均可满足). | ||
两者均可做到动态负载均衡. | ||
|
||
### OfflineService | ||
--- | ||
离线管理服务, 对于不在线的用户或者其他没有装载的非单例service, 均可以把本来要交给这些service已装载情况下要处理的消息通过该服务驻留到数据库和内存, 在这些service装载后该离线service会自动推送. 使用方法只是把toService中的Service Type转向到该离线管理服务即可. | ||
|
||
- [x] docker起服物理拓扑连接构建 | ||
- [x] docker起服service依赖机制实现,拓扑构建实现. | ||
- [x] docker起服间,正常运作状态,关服间的service与service, service与docker间的通讯实现. | ||
- [x] service间rpc通讯实现,支持回调,并自动清理超时等待的call. | ||
- [x] module机制的实现并无缝集成给service. | ||
- [x] client==>ServiceUserMgr(用户中心service)==>动态构建ServiceUser ==>回写数据库并卸载==>通知给客户端 用户登录,创角,通讯,离线后一段时间后回写数据库并卸载ServiceUser. | ||
- [x] service卸载机制实现, 按照依赖顺序反向卸载service, service卸载需要所有module卸载完毕. | ||
- [x] docker安全关停流程 | ||
- [x] 压测脚本实现,实现一定数量的机器人自动登录,创角,互相通讯,然后仿业务pingpong. 目前测试QPS单节点10K QPS的性能, 未经优化. | ||
- [x] 通过配置构建10个以上的docker集群, 并进行合理的service划分,然后压测. | ||
- [x] 鲁棒性更强的负载均衡,非关键service所属的docker宕机后可以保证关键业务的正常运作,并通过在线重启快速恢复服务. | ||
- [x] ServiceMinitorMgr 监控和统计服务 | ||
- [x] ServiceOfflineMgr 离线消息管理器实现, 需要记录到数据库, 玩家上线后拉取离线消息或者离线奖励等. | ||
- [x] ServiceWebAgent http协议的对外web server接口实现, http协议连接外部网站并获得数据的web client实现. | ||
- [ ] ItemModule实现, 实现道具背包系统. | ||
- [ ] MissionModule实现 | ||
- [ ] 整体性review代码,优化实现. | ||
### DBDict | ||
该字典类不属于docker和service, 是一个全局可直接访问的字典集合, 存储服务器引擎所有业务配置(字典) . | ||
|
||
|
||
## 添加一个service | ||
1. 在defined.h中添加service类型和类型名字. | ||
2. 在config.lua配置文件中给新加的service配置一个docker来装载该服务. | ||
2. 添加一个类并继承Service. 可以直接copy shellService然后修改. | ||
3. 在docker.cpp中include新添加的文件并在createService中写一行实例化代码. | ||
## 后续版本计划 | ||
对service和现有的utls公共小工具添加lua胶水代码, 并实现一套lua版的ModuleData来同步数据库, 这样就引擎的使用者可以自由决策逻辑层用lua还是C++ . | ||
该计划的具体实现方案已有, 以及相应的性能,易用性和稳定性也均有可控的预期实现. | ||
需求暂不强烈, 暂缓该计划的执行. | ||
|
||
## About The Author | ||
Auther: YaweiZhang | ||
Mail: [email protected] | ||
GitHub: https://github.com/zsummer | ||
**Auther**: YaweiZhang | ||
**Mail**: [email protected] | ||
**GitHub**: https://github.com/zsummer | ||
|
||
|
||
## Friend Open Source | ||
**NoahGameFrame** | ||
|