8.3 发送消息给消息队列

现在,worker工作池已经准备就绪了,那么就需要有一个给到worker工作池消息的入口,我们再定义一个方法

zinx/ziface/imsghandler.go

  1. //将消息交给TaskQueue,由worker进行处理
  2. func (mh *MsgHandle)SendMsgToTaskQueue(request ziface.IRequest) {
  3. //根据ConnID来分配当前的连接应该由哪个worker负责处理
  4. //轮询的平均分配法则
  5. //得到需要处理此条连接的workerID
  6. workerID := request.GetConnection().GetConnID() % mh.WorkerPoolSize
  7. fmt.Println("Add ConnID=", request.GetConnection().GetConnID()," request msgID=", request.GetMsgID(), "to workerID=", workerID)
  8. //将请求消息发送给任务队列
  9. mh.TaskQueue[workerID] <- request
  10. }

SendMsgToTaskQueue()作为工作池的数据入口,这里面采用的是轮询的分配机制,因为不同链接信息都会调用这个入口,那么到底应该由哪个worker处理该链接的请求处理,整理用的是一个简单的求模运算。用余数和workerID的匹配来进行分配。

最终将request请求数据发送给对应worker的TaskQueue,那么对应的worker的Goroutine就会处理该链接请求了。