看文档看到了高级,应答请求这一部分,记录一下整体的过程
流程图
![](https://img-blog.csdnimg.cn/807ae4b9c2fd476b8e4494f64d87b714.png)
1.FrontendRouter是一个前端Router模式的套接字;
2.BackendRouter是一个后端Router模式的套接字;
3.Client与Work都是REQ模式的套接字;
4.ZMQ中Router模式的套接字在接收消息后内部会自动在消息头部增加对方套接字标识的消息帧;以一个空字符串隔开;
5.上图的模式中Frontend与Backend工作在服务模式下,等待Client与Work发起连接;
6.程序一开始WorkA、WorkB、WorkC会向Backend发起连接,并发送Ready消息,目的是告知BackendRouter服务自己是一个空闲的状态,随时可以处理任务。
7.在读取BackendRouter的消息时,会读取各个Work的套接字标识,此时将各个Work的套接字标识保存在一个队列中,凡是在这个队列里的Work都认为是空闲的;
8.此时FrontendRouter成功收到一条ClientA请求的任务后,想work队列中查找第一个空闲的工作节点,然后把这个工作节点的套接字标识放置在ClientA消息的头部;然后交由BackendRouter发送;
9.BackendRouter在内部会自动的查找此条消息头部的第一个套接字标识,然后找到内部的这个套接字后,由它来发送消息,注意此条消息第一帧的地址已经自动去除;
10.Work工作节点接收到的是一条带有ClienA地址的消息,Work处理后把这调消息的数据帧的数据修改为处理后的数据,然后发送给BackendRouter;
11.BackendRouter接收到Work的应答消息后,会在头部自动增加一条Work的地址信息帧;
12.此时程序要去掉Work的地址帧,然后交由FrontendRouter发送;
13.FrontendRouter在发送时会根据帧头部的地址找到Client套接字,然后去掉地址帧后发送数据给Client;
14.Client成功收到应答数据;
总结:
1.Router套接字接收到消息后,会自动给这个消息头部增加源套接字的标识。
2.Router在发送时,需要指定源套接字的地址,如果没有指定,或者指定的套接字Router内部没有缓存,则这帧消息发送失败。
以上2条就是这个机制最核心的地方;