Skip to content
/ breeze Public

一个C++的轻量级的分布式服务器引擎, 架构思想为一切皆service.

License

Notifications You must be signed in to change notification settings

zsummer/breeze

Folders and files

NameName
Last commit message
Last commit date

Latest commit

e6bf1a3 · Jun 15, 2020
Oct 7, 2017
Dec 13, 2017
Dec 13, 2017
Dec 17, 2017
Dec 13, 2017
Sep 10, 2015
Jul 3, 2017
Jun 14, 2020
Jun 15, 2020
Oct 9, 2015
Feb 22, 2018
May 23, 2017
Jun 13, 2020
Jun 8, 2019
Jul 3, 2016
May 23, 2017

Repository files navigation

Welcome to the breeze wiki!

breeze简述

Build Status
breeze是一个C++的轻量级的分布式服务器引擎, 架构思想为一切皆service.
breeze is a lightweight, fast, distributed server engine. greatly inspired by docker, bigworld and starwing/loki . the thoughts is " all is service ".

特点:

  • 实现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的单组服务器设计容量在实际项目中, 轻度游戏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个数的平方

service:


service是breeze引擎的核心结构, 通过包装对docker接口的再次包装, 实现 "all is service" 这一思想.

通过简单的toService即可把数据发往另外一个service而不需要关心对方装载在本地还是另外一个docker上.
通过sloting方法可以注册当前service可接收的消息类型和对应的处理方法 toService可以携带本地回调方法, 对方收到消息后通过backToService返回的消息可以直接在回调中处理. 创建一个service只需要集成该基类, 填写对应的onLoad onUnload等方法即可.
service的依赖关系通过简单的定义即可, docker会自动组织为正确的装载/卸载依赖拓扑图并据此进行装载和卸载等操作.

已实现的部分业务模块 (核心框架部分)

登录流程


已实现多角色账户的登录,创建用户,装载用户service, 切换用户客户端, 踢掉客户端, 卸载用户service, 离线消息, webservice, dbservice等.

DBService

直接操作数据库的的service, 每个db一个线程, 每个db对应一个service type.
所有运行中的数据库操作, info,log等 都需要走该service中专.
配合proto4z的mysql序列化方案, 可以一个调用实现增删改查, 而通过ModuleData的模板类, 则实现按照业务模块一键从数据库中load/create/update/insert等同步.

AvatarMgrService


玩家中心service, 用于玩家service的创建,装载,客户端认证通讯关联等.
也用于玩家管理,特别是离线玩家的管理(在线玩家可以直接server对service进行交互).

WebService


提供web 服务器/客户端相关服务. 通过配置可以在该service中直接处理来自web客户端的请求, 并可以处理来自内部的消息然后向外部发起web请求,并回调给来源(服务器gm后台实时查询管理接口, 向外部发起的渠道认证等需求均可满足).
两者均可做到动态负载均衡.

OfflineService


离线管理服务, 对于不在线的用户或者其他没有装载的非单例service, 均可以把本来要交给这些service已装载情况下要处理的消息通过该服务驻留到数据库和内存, 在这些service装载后该离线service会自动推送. 使用方法只是把toService中的Service Type转向到该离线管理服务即可.

DBDict

该字典类不属于docker和service, 是一个全局可直接访问的字典集合, 存储服务器引擎所有业务配置(字典) .

STWorldMgr

场景服务, 异构模块.
该服务为一个小型实时MOBA服务器. 包括场景管理服务和场景服务集群
目前已经实现作为一个moba游戏的核心框架和模块.
该服务器的实现初衷为复刻一个小型war3服务器,通过玩法定制实现WAR的各种自定义地图模式.
对应的客户端项目为breeze_unity3d_client

后续版本计划

对service和现有的utls公共小工具添加lua胶水代码, 并实现一套lua版的ModuleData来同步数据库, 这样就引擎的使用者可以自由决策逻辑层用lua还是C++ .
该计划的具体实现方案已有, 以及相应的性能,易用性和稳定性也均有可控的预期实现.
需求暂不强烈, 暂缓该计划的执行.

About The Author

Author: YaweiZhang
Mail: yawei.zhang@foxmail.com
GitHub: https://github.com/zsummer

Friend Open Source

NoahGameFrame

  • Author: ketoo
  • GitHub: https://github.com/ketoo/NoahGameFrame
  • Description: A fast, scalable, distributed game server framework for C++, include actor library, network library,can be used as a real time multiplayer game engine ( MMO RPG ), which plan to support C#/Python/Lua script, and support Unity3d, Cocos2dx, FlashAir client access.

gce

  • Author: nousxiong
  • GitHub: https://github.com/nousxiong/gce
  • Description: The Game Communication Environment (GCE) is an actor model framework for online game development.