- 8.1 创建消息队列
8.1 创建消息队列
首先,处理消息队列的部分,我们应该集成到MsgHandler模块下,因为属于我们消息模块范畴内的
zinx/znet/msghandler.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对应一个queueTaskQueue: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
/*存储一切有关Zinx框架的全局参数,供其他模块使用一些参数也可以通过 用户根据 zinx.json来配置*/type GlobalObj struct {/*Server*/TcpServer ziface.IServer //当前Zinx的全局Server对象Host string //当前服务器主机IPTcpPort 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()}
