请问workman gateway worker结构怎么打造大型分布式消息系统?
网友回复
GatewayWorker介绍
GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架,实现了单发、群发、广播等接口,内置了mysql类库,GatewayWorker分为Gateway进程和Worker进程,天然支持分布式部署,能够支持庞大的连接数(百万甚至千万连接级别的应用)。可用于开发IM聊天应用、移动通讯、游戏后台、物联网、智能家居后台等等。
GatewayWorker工作原理
1、可以方便的实现客户端之间的通讯 2、Gateway与Worker之间是基于socket长连接通讯,也就是说Gateway、Worker可以部署在不同的服务器上,非常容易实现分布式部署,扩容服务器 3、Gateway进程只负责网络IO,业务实现都在Worker进程上,可以reload Worker进程,实现在不影响用户的情况下完成代码热更新。 工作流程
1、Register、Gateway、BusinessWorker进程启动 2、Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己 3、Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中 4、Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给BusinessWorker 5、BusinessWorker进程得到所有的Gateway内部通讯地址后尝试连接Gateway 6、如果运行过程中有新的Gateway服务注册到Register(一般是分布式部署加机器),则将新的Gateway内部通讯地址列表将广播给所有BusinessWorker,BusinessWorker收到后建立连接 7、如果有Gateway下线,则Register服务会收到通知,会将对应的内部通讯地址删除,然后广播新的内部通讯地址列表给所有BusinessWorker,BusinessWorker不再连接下线的Gateway 8、至此Gateway与BusinessWorker通过Register已经建立起长连接 9、客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑。 10、BusinessWorker的业务逻辑入口全部在Events.php中,包括onWorkerStart进程启动事件(进程事件)、onConnect连接事件(客户端事件)、onMessage消息事件(客户端事件)、onClose连接关闭事件(客户端事件)、onWorkerStop进程退出事件(进程事件) GatewayWorker OR Workerman 如果你的项目是长连接并且需要客户端与客户端之间通讯,建议使用GatewayWorker。 短连接或者不需要客户端与客户端之间通讯的项目建议使用Workerman。 GatewayWorker不支持UDP监听,所以UDP服务请选择Workerman。 如果你是一个有多进程socket编程经验的人,喜欢定制自己的进程模型,可以选择Workerman。 GatewayWorker安装
composer require workerman/gateway-worker 目录结构 ├── BusinessWorker.php ├── Gateway.php ├── Lib │ ├── Context.php │ ├── DbConnection.php │ ├── Db.php │ └── Gateway.php ├── Protocols │ └── GatewayProtocol.php └── Register.php Gateway使用
Gateway类用于初始化Gateway进程。Gateway进程是暴露给客户端的让其连接的进程。所有客户端的请求都是由Gateway接收然后分发给BusinessWorker处理,同样BusinessWorker也会将要发给客户端的响应通过Gateway转发出去。 require_once 'vendor/autoload.php'; use Workerman\Worker; use GatewayWorker\Gateway; 初始化: $gateway = new Gateway('protocol://ip:port’); 支持协议 为应用层协议,目前支持的协议有 1、websocket协议 2、text协议 3、Frame协议 4、自定义通讯协议 5、tcp,直接裸tcp,不推荐 属性 name 和Worker一样,可以设置Gateway进程的名称,方便status命令中查看统计 count 和Worker一样,可以设置Gateway进程的数量,以便充分利用多cpu资源 lanIp lanIp是Gateway所在服务器的内网IP,默认填写127.0.0.1即可。多服务器分布式部署的时候需要填写真实的内网ip,不能填写127.0.0.1。注意:lanIp只能填写真实ip,不能填写域名或者其它字符串,无论如何都不能写0.0.0.0 . startPort Gateway进程启动后会监听一个本机端口,用来给BusinessWorker提供链接服务,然后Gateway与BusinessWorker之间就通过这个连接通讯。这里设置的是Gateway监听本机端口的起始端口。比如启动了4个Gateway进程,startPort为2000,则每个Gateway进程分别启动的本地端口一般为2000、2001、2002、2003。 当本机有多个Gateway/BusinessWorker项目时,需要把每个项目的startPort设置成不同的段 registerAddress,注册服务地址,只写格式类似于 '127.0.0.1:1236’ 回调属性 onWorkerStart 和Worker一样,可以设置Gateway进程启动后的回调函数,一般在这个回调里面初始化一些全局数据 onWorkerStop 和Worker一样,可以设置Gateway进程关闭的回调函数,一般在这个回调里面做数据清理或者保存数据工作 onConnect(比较少用到,开发者一般不用关注) 和Worker一样,可以设置onConnect回调,当有客户端连接上来时触发。与Events::onConnect的区别是Events::onConnect运行在BusinessWorker进程上。Gateway::onConnect是运行在Gateway进程上,无法使用\GatewayWorker\Lib\Gateway类提供的接口 onClose(比较少用到,开发者一般不用关注) 和Worker一样,可以设置onClose回调,当有客户端连接关闭时触发。同样与Events::onClose的区别是Gateway::onClose是运行在Gateway进程上,无法使用\GatewayWorker\Lib\Gateway类提供的接口 BusinessWorker使用 BusinessWorker类其实也是基于基础的Worker开发的。BusinessWorker是运行业务逻辑的进程,BusinessWorker收到Gateway转发来的事件及请求时会默认调用Events.php中的onConnec...
点击查看剩余70%