• 8.3 发送消息给消息队列

    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就会处理该链接请求了。