2019独角兽企业重金招聘Python工程师标准>>>

我们先来看看第一种模式:Request-Reply Pattern。 请求应答模式。

Request-Reply这个名字很直白,口语点说就是一问一答。可以使同步的遵循请求序的一问一答,也可以 是异步的不按请求序的一问一答;其中也可以包含各种不同的路由策略——让谁来回答。zeromq定义的为这个模式服务的socket有:ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER以及ZMQ_DEALER. 用他们进行合理的组合,就可以实现现实世界中各种不同的请求应答模式。

分别来看:

ZMQ_REQ

ZMQ_REQ做的事情就是发问,然后收答。发、收必须是严格按序进行。请求时对对端进行Round Robin,遇到异常则阻塞。官方对这个socket的总结如下:

Summary of ZMQ_REQ characteristics
Compatible peer sockets ZMQ_REP
Direction Bidirectional
Send/receive pattern Send, Receive, Send, Receive, …
Outgoing routing strategy Round-robin
Incoming routing strategy Last peer
ZMQ_HWM option action Block

ZMQ_REP

ZMQ_REP做的事情是收问题然后回答。收、发严格按序调用。对收到的问题公平排队,逐一作答。回答发出时遇到异常则直接丢弃,不会阻塞。

Summary of ZMQ_REP characteristics
Compatible peer sockets ZMQ_REQ
Direction Bidirectional
Send/receive pattern Receive, Send, Receive, Send, …
Incoming routing strategy Fair-queued
Outgoing routing strategy Last peer
ZMQ_HWM option action Drop

可以发现,上述两种socket是纯同步的,连用在它们身上的api的调用顺序都有严格定义。而且没有办法动态决定请求的去向。如果要实现更复杂的请求应答模式,就要借助于下面两种socket了。

ZMQ_DEALER

其实ZMQ_DEALER也是同步的,ZMQ_DEALER也叫作ZMQ_XREQ,概念上是request/reply socket的扩展(实现上刚好相反哦)。从名字上可知它是一个代理层。它对收到的消息公平排队,并以RR方式发送消息,在遇到异常时发送阻塞。它的主要 作用是将come in的请求load balance地发送给到对端们。

Summary of ZMQ_DEALER characteristics
Compatible peer sockets ZMQ_ROUTERZMQ_REQZMQ_REP
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy Round-robin
Incoming routing strategy Fair-queued
ZMQ_HWM option action Block

ZMQ_ROUTER

ZMQ_ROUTER是真正的异步。ZMQ_ROUTER socket收到消息时会在消息栈上加一层包含消息来源地址的消息;发送消息时,会将这一层消息取出,将其作为发送的目的地。如果发送时遇到异常,则丢弃 消息。ZMQ_ROUTER通过这种方式做到了不需要保存任何状态便可异步地转发消息,而这一切应用层是看不到的。

Summary of ZMQ_ROUTER characteristics
Compatible peer sockets ZMQ_DEALERZMQ_REQZMQ_REP
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy See text
Incoming routing strategy Fair-queued
ZMQ_HWM option action Drop

总结

归纳总结一下,0mq的Request-Reply模式下有四种socket类型:

  • DEALER: 给连接的对端RR地分发消息,对收到的消息公平排队。
  • REQ:在应用层外发的消息上加一层空消息再发送;在收到消息后去掉分隔空消息再返回应用层。它实质上是在DEALER上构建的,只是在此基础上强制加入了发、收循环。
  • ROUTER:针对每一个收到的消息:加一层来源地址段,然后再交给应用层;针对每一个要发出的消息:去掉最上层的地址段,并以该地址段为目的地进行发送。
  • REP:对收到的消息:储存所有的消息内容直到第一个分隔空消息段,把剩余的消息体传给应用层;对发出的消息:把之前储存的消息体加回来,并像ROUTER一样发送出去。它实质上实在ROUTER上构建的,只是在此基础上强制加入了收、发循环。

有了这几种socket,便可以组合成各种Request-Reply模式了:

[REQ] <--> [REP] [REQ] <--> [ROUTER--DEALER] <--> [REP] [REQ] <--> [ROUTER--DEALER] <--> [ROUTER--DEALER] <--> [REP]...

举个例子,N个client要给M个worker提交任务,worker完成任务后返回给client;worker需要平衡负载以避免某一 worker过于劳累,client发出的请求也有先后之说,不能让后发的请求先于之前的被交给worker。这番描述的socket组合便可如下图 (from the guide)方式构建:

转载于:https://my.oschina.net/goldwave/blog/159607

(转)ZeroMQ的模式-Requset-Reply相关推荐

  1. [zz]ZeroMQ 的模式

    在需要并行化处理数据的时候,采用消息队列通讯的方式来协作,比采用共享状态的方式要好的多.Erlang ,Go 都使用这一手段来让并行任务之间协同工作. 最近读完了 ZeroMQ 的 Guide.写的很 ...

  2. wcf 基础知识 之 消息交换模式 response/reply oneway deplex

    wcf支持请求-回复(response-reply).单工(oneway)以及双工(duplex)三种消息交换模式.今天我们来说一下第一种消息交换模式--请求--回复,请注意这里是消息交换模式. 请求 ...

  3. Python使用ZeroMQ/inproc模式实现多线程服务端

    第4届全国高校大数据与人工智能教学研讨会(厦门大学) 2021年全国高校Python程序设计课程高级研修班通知 中国大学MOOC"Python程序设计基础"免费学习地址 2020年 ...

  4. 传输层的各种模式——ZeroMQ 库的使用 .

    最近在研究 ZeroMQ 库的使用,所以在这里总结一下各种模式,以便日后拿来使用. 关于 ZeroMQ 库,我就不多介绍了,大家可以参考下面一些文章,以及他的官网.使用指南.API 参考.项目仓库等内 ...

  5. 消息队列(MQ):ZeroMQ基本原理

    目录 1 ZeroMQ概述 2 ZeroMQ工作模式 2.1 请求-应答 2.2 发布-订阅 2.3 并行管道 3 参考 1 ZeroMQ概述        ZeroMQ看起来想一个可嵌入的网络库,但 ...

  6. 【linux + lighttpd + php + zeromq】之实战训练二

    三.实践 2. zeromq mdp(Majordomo Protocol)模式测试 说明: 1) zeromq mdp模式大家可以到zeromq官网的guide自己学习,不在此处赘述. 不过mdp模 ...

  7. python 服务端性能_python 学习笔记---Locust 测试服务端性能

    由于人工智能的热度, python目前已经成为最受欢迎的编程语言,一度已经超越Java . 本文将介绍开源的python 测试工具: locust 使用步骤: 1. 安装python 3.0以上版本 ...

  8. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  9. 腾讯T9/T3.1级别的后台服务器开发技术专家是怎样炼成的?

    今天给大家分享一下腾讯T9/T3.1级别的技术顾问的学习路线,希望对在自学提升的朋友有一些帮助,学习途径总结在下面这张思维导图里面了,觉得还不错的请点赞收藏支持一下.尺寸所限略显模糊,需要清晰版的朋友 ...

最新文章

  1. 如何使用ember下拉框组件??
  2. pytorch crossentropy为nan
  3. 【nginx+lua高性能web应用开发(二):开发评论模块(ssi+mysql)】
  4. 异步编程异常和死锁处理
  5. linux操作系统之读写锁
  6. python信用卡客户_Python开发之基于模板匹配的信用卡数字识别功能
  7. B00003 C++标准库 std::bitset
  8. 别点进来! Linux 与 Mac 下有趣但毫无用处的命令(转载)
  9. android 获取微信二维码 DiffDevOAuth.auth
  10. WPF下关于NotifyIcon的使用
  11. 当我们在谈论高并发的时候究竟在谈什么?
  12. redmine backlogs的tracker使用
  13. 棣拓DTAS公差分析软件-蒙特卡洛法公差分析软件-容差分析软件
  14. 什么是跨域及怎么解决跨域问题?
  15. 修复版动态视频壁纸微信小程序源码下载,支持多种类型流量主收益
  16. lammps案例:分子自由落体运动模拟
  17. 淘宝宝贝标题的优化设置技巧
  18. 睡眠多少分钟一个循环_你知道睡眠周期吗?
  19. 极限学习机(Extreme Learning Machine)ELM
  20. 【非原创】PHPMywind调用

热门文章

  1. 将***拒之门外 设置电脑防止******
  2. 为什么颜值越来越重要_看脸时代来了吗?为什么这个时代越来越注重颜值?
  3. rocketmq python 一个进程订阅多个topic_玩转不同业务场景,这些RabbitMQ特性会是得力助攻...
  4. 开源oa_开源OA:可以轻松支持云文档管理
  5. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
  6. php脚本函数,PHP执行系统命令函数实例讲解
  7. scrollview复用节点_ScrollView 两个控件复用, ScrollView 的极限优化
  8. python函数第二次运行报错_Python学习笔记2-函数、高级特性
  9. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)
  10. 牛客练习赛84:牛客推荐系统开发之标签重复度(点分治+动态开点权值线段树)