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所示,由客户端,服务器端监听线程,后台消息处理线程组成。
整个消息通信流程如下:
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发送给对应的客户端,至此,整个消息通信过程结束。
>>>强海盗模式<<<
- ZMQ——多线程通信(过程)
- ZMQ——VS2012
- zmq源码阅读——Msg.hpp & Msg.cpp 的 相关操作 (zmq中的消息)
- zmq常用通信模式
- zmq技术--网络通信
- python使用zmq通信
- 使用zmq多次通信
- Linux——ZMQ-zmq_socket
- ZMQ 握手过程解析
- node.js使用zmq通信
- 多线程(5)—线程通信
- Linux——ZMQ环境搭建
- ZMQ——注意的问题
- 多线程通信——事件
- 多线程通信——互斥量
- 多线程通信——信号量
- 多线程——线程通信
- zeromq源码阅读 —— Msg.hpp & Msg.cpp 的 msg_t (zmq中的消息)
- 随便几句话而已
- 使用Spring的ReloadableResourceBundleMessageSource读取properties配置
- C++的MFC 与 HTML 双向通讯 --[已解决]
- 包和访问权限(二)
- python sorted用法
- ZMQ——多线程通信(过程)
- Pascal's Triangle
- Struts2.3.16.1+Hibernate4.2.4+Spring4.0.2注解整合
- Gulp的目标是取代Grunt
- 使用的开源控件解决问题
- cocos2d html5 简易点餐客户端
- C++编程思想第二章课后练习
- POJ 1380 Equipment Box(判断一个长方形能不能包含另一个长方形)
- Pascal's Triangle II