现在,你已经熟练的掌握了REQ/REP模式,它是一个一对多的模式,一个REP对应多个REQ。

但是现实工作中,我们会遇到这样的难题,一个REP无法满足REQ的提问,因为REQ太多了,虽然可以增加一个REP,但是,这样做会带来很多问题。两个REP的端口不可能是一个,那么就需要将原来的一些REQ与这个新的REQ连接,这里面的工作量可想而知。那么我们能不能采取一种简单方便的方式,使得REQ和REP都可以灵活的增加减少而不对系统造成负面影响导致工作量上升呢?

面对这样的要求,我们需要一个代理。让REQ和REP都连接这个代理,一切繁杂的事情都由这个代理进行。我从《ZeroMQ 云时代极速消息通信库》这本书里拍下了扩展的请求-应答解析图。

在扩展的请求-应答系统里,REQ和REP并不直接通信,而是通过ROUTER和DEALER,ROUTER是路由器,DEALER是经销商,所有的请求到达路由器以后公平的排队,然后由经销商负载均衡后发送给REP服务器,服务器应答的结果再由经销商和路由器返回给REQ客户端。

在这个系统里,你可以随意的增加和减少REQ,可以随意的增加和减少REP,而不必为此付出额外的工作量。

到了这一步,聪明的朋友已经发现了问题了,一个DEALER怎么可以连接多个REP呢?没错,一个DEALER不能连接多个REP,但多个REP可以连接一个DEALER。在一对多的REQ/REP模型中,REP都是等待REQ来连接的,但在我们上图所示的系统中,REP是主动连接DEALER的,而不是等待DEALER来连接它。

奉上示例代码

客户端:

#coding=utf-8
'''
Created on 2015-10-13
发起请求
@author: kwsy2015
'''
import zmq#  Prepare our context and sockets
context = zmq.Context()
socket = context.socket(zmq.REQ)
#这一次,我们不连接REP,而是连接ROUTER,多个REP连接一个ROUTER
socket.connect("tcp://localhost:5559")#  发送问题给ROUTER
for request in range(1,11):socket.send(b"Hello")message = socket.recv()print("Received reply %s [%s]" % (request, message))
socket.close()
context.term()

中间代理

#coding=utf-8
'''
Created on 2015-10-13@author: kwsy2015
'''
import zmq# Prepare our context and sockets
context = zmq.Context()frontend = context.socket(zmq.ROUTER)
backend = context.socket(zmq.DEALER)
frontend.bind("tcp://*:5559")
backend.bind("tcp://*:5560")# Initialize poll set
poller = zmq.Poller()
poller.register(frontend, zmq.POLLIN)
poller.register(backend, zmq.POLLIN)# Switch messages between sockets
while True:socks = dict(poller.poll())# frontend 收到了提问后,由backend发送给REP端if socks.get(frontend) == zmq.POLLIN:message = frontend.recv_multipart()backend.send_multipart(message)# backend 收到了回答后,由frontend发送给REQ端if socks.get(backend) == zmq.POLLIN:message = backend.recv_multipart()frontend.send_multipart(message)

服务端

#coding=utf-8
'''
Created on 2015-10-13
收到请求后回复world
@author: kwsy2015
'''
import zmqcontext = zmq.Context()
socket = context.socket(zmq.REP)
# REP连接的是DEALER
socket.connect("tcp://localhost:5560")while True:message = socket.recv()print("Received request: %s" % message)socket.send(b"World")

在服务端,REP没有调用bind函数,而是调用了connect函数去连接DEALER。请求的排队和服务端的负载均衡均由中间的代理完成了,事情就是这样的简单。

python与zmq系列(6)相关推荐

  1. (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二

    10 行代码判定色*情*图片--Python 也可以系列之二 作者:赖勇浩(http://blog.csdn.net/lanphaday) 致编辑:我已经给图片打上马赛克了,别再删除了啊,我这是纯技术 ...

  2. Python股票分析系列——基础股票数据操作(二).p4

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...

  3. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  4. 九十一、Python的GUI系列 | QT组件篇

    @Author:Runsen @Date:2020/7/13 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  5. 九十、Python的GUI系列 | QtDesigner进行界面设计

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  6. 八十九、Python的GUI系列 | 使用PyQt5 快速构建一个GUI 应用

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  7. 八十一、Python | Leetcode 二叉树系列(下篇)

    @Author:Runsen @Date:2020/7/6 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  8. 七十四、Python | Leetcode数字系列(下篇)

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  9. 七十三、Python | Leetcode数字系列(上篇)

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. 2014 Container技术大会:未来Linux Container会是PaaS平台的核心
  2. 带有骆驼,ActiveMQ,Elasticsearch的HL7关键用例
  3. 给开源项目贡献代码_您可以为开源做出6种非代码贡献
  4. TrashFlash卡是什么
  5. php soap 用法,php soap用法
  6. JanusGraph学习手册
  7. 计算机学报Latex模板运行出错解决
  8. 微信图片怎么添加竖排文字_微信拍照的照片怎样加文字?
  9. epub、ocf等常用电子书格式浅析----附JAVA示例程序
  10. Linux内核源码阅读以及工具(转)
  11. c语言放空一个数组,数组越界真可怕,莫名就闯到了别人家
  12. 解析器生成器 ANTLR的详细介绍
  13. 浏览器扩展管理 - 高级版
  14. 微信小程序-注册成为小程序开发者
  15. PAC—主成分分析方法
  16. 服务器系统能玩吃鸡么,迅游普通vip能吃鸡能玩什么服务器 | 手游网游页游攻略大全...
  17. linux. 获得cpu利用率 arm,Linux如何统计进程的CPU利用率
  18. 密码全安控件OCX版本发布
  19. mysql备份管家婆_管家婆怎么用SQL恢復以前备份的数据
  20. PDF加密文件不能复制、不能打印的解决办法

热门文章

  1. 汉字转拼音_gb2312 C#
  2. Smartbi“三步走”构建智慧经营分析平台,实现国有企业监管报送和数智化转型
  3. 第十届蓝桥杯C语言大学B组C/C++ 试题A:组队
  4. iPhone为什么这么流畅?对比下清理方法就能发现,难怪不卡顿
  5. host文件不存在 windows7
  6. 南开02-06经济学考研真题和我的一点考研心得
  7. css详解background八大属性及其含义
  8. 使用Echarts制作图表基础教程
  9. 8月27日计算机视觉理论学习笔记——图说
  10. 首先先从营养补给蔬果开始30岁的女性容易缺乏钙