注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

ZMQ JAVA使用心得之 多线程消息通信实现  

来自@宝   2012-06-18 21:10:17|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

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所示,由客户端,服务器端监听线程,后台消息处理线程组成。

2012年06月18日 - @宝 - @宝

 图1-1 消息通信系统架构图

整个消息通信流程如下:

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

 

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

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发送给对应的客户端,至此,整个消息通信过程结束。

 

  评论这张
 
阅读(1717)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017