🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 8.1 创建消息队列 首先,处理消息队列的部分,我们应该集成到`MsgHandler`模块下,因为属于我们消息模块范畴内的 > zinx/znet/msghandler.go ```go type MsgHandle struct { Apis map[uint32]ziface.IRouter //存放每个MsgId 所对应的处理方法的map属性 WorkerPoolSize uint32 //业务工作Worker池的数量 TaskQueue []chan ziface.IRequest //Worker负责取任务的消息队列 } func NewMsgHandle() *MsgHandle { return &MsgHandle{ Apis: make(map[uint32]ziface.IRouter), WorkerPoolSize:utils.GlobalObject.WorkerPoolSize, //一个worker对应一个queue TaskQueue:make([]chan ziface.IRequest, utils.GlobalObject.WorkerPoolSize), } } ``` 这里添加两个成员 `WokerPoolSize`:作为工作池的数量,因为TaskQueue中的每个队列应该是和一个Worker对应的,所以我们在创建TaskQueue中队列数量要和Worker的数量一致。 `TaskQueue`真是一个Request请求信息的channel集合。用来缓冲提供worker调用的Request请求信息,worker会从对应的队列中获取客户端的请求数据并且处理掉。 当然`WorkerPoolSize`最好也可以从`GlobalObject`获取,并且`zinx.json`配置文件可以手动配置。 > zinx/utils/globalobj.go ```go /* 存储一切有关Zinx框架的全局参数,供其他模块使用 一些参数也可以通过 用户根据 zinx.json来配置 */ type GlobalObj struct { /* Server */ TcpServer ziface.IServer //当前Zinx的全局Server对象 Host string //当前服务器主机IP TcpPort int //当前服务器主机监听端口号 Name string //当前服务器名称 /* Zinx */ Version string //当前Zinx版本号 MaxPacketSize uint32 //都需数据包的最大值 MaxConn int //当前服务器主机允许的最大链接个数 WorkerPoolSize uint32 //业务工作Worker池的数量 MaxWorkerTaskLen uint32 //业务工作Worker对应负责的任务队列最大任务存储数量 /* config file path */ ConfFilePath string } //... //... /* 提供init方法,默认加载 */ func init() { //初始化GlobalObject变量,设置一些默认值 GlobalObject = &GlobalObj{ Name: "ZinxServerApp", Version: "V0.4", TcpPort: 7777, Host: "0.0.0.0", MaxConn: 12000, MaxPacketSize: 4096, ConfFilePath: "conf/zinx.json", WorkerPoolSize: 10, MaxWorkerTaskLen: 1024, } //从配置文件中加载一些用户配置的参数 GlobalObject.Reload() } ```