ZMQ——多线程通信(过程)

来源:互联网 发布:单片机输入的是什么 编辑:程序博客网 时间:2024/05/16 11:36

ZMQ与传统的TCP Socket最大的区别在于Socket连接不再是1:1的,而是1:N甚至N:N的,这意味ZMQ摒弃了每个后台请求处理线程都使用单独的一个Socket来返回用户请求的。同时,ZMQ又不允许多个线程共享Socket,所以ZMQ在使用一个Socket处理请求的过程中,会阻塞同一个端口的其他请求,显然这是无法满足需求的。ZMQ使用了信封的机制灵活的解决了这个问题。

正如上节介绍,ZMQ的Socket有4种类型:DEALER,REQ,REP,ROUTER。4种Socket之间的组合变化基本可以满足绝大多数消息通信的需求,当然也可以实现多线程处理用户请求。信封机制的核心是Router Socket,它可以为每一个来自REQ的请求打上一个标记来标识该REQ,在返回的时候直接返回给对应的REQ,利用Router我们就可以实现利用多线程处理用户请求。

这里我们采用经典的请求-响应模式为例,了解如何利用ZMQ实现多线程处理用户请求。整个消息通信系统的架构如图1-1所示,由客户端,服务器端监听线程,后台消息处理线程组成。

ZMQ JAVA使用心得之 多线程消息通信实现 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

 

图1-2 消息结构示意图
========================

整个消息通信流程如下:

1)客户端使用REQ Socket发送消息给服务器端监听线程的Front Router,REQ Socket会为每一个用户请求消息前加入一个空帧(Frame);

2)Front Router在接到REQ的消息后,会判断该REQ是否是持久化Socket,即是否有标示符,如果没有,则自动为该REQ生成一个标示符。将该标识符作为一个帧加入到整个消息的前面。如上节所述,ZMQ的消息(ZMsg)由若干个帧(ZFrame)组成,当前,整个ZMsg由三个部分组成,Client Identifier,空帧和消息实体

3) Front Router在接到消息后,服务器端监听线程会将该消息交给一个后台线程进行处理,然后继续监听其他客户端请求,这样就不会阻塞端口;

4)后台消息处理线程将接到的消息进行拆分,取出客户端请求进行处理,然后按照ClientIdentifier,空帧和返回内容组装成新的Zmsg,交给该后台线程REQ。

5)后台消息处理线程的REQ在接到ZMsg后,会为该Zmsg外层再加入一个空帧,然后发送给服务器端监听线程的Backend Router;

6)Backend Router同理会自动在接到ZMsg的最外层加入一个后台线程的标示符,然后服务器监听线程对消息进行拆分,取出ClientIdentifier,然后交给FrontRouter,利用Front Router发送给对应的客户端,至此,整个消息通信过程结束。

>>>强海盗模式<<<

 

 

0 0