`
pjwqq
  • 浏览: 79688 次
社区版块
存档分类
最新评论

pyzmq提升REQ/REP模式可靠性(1)

阅读更多

  (原文在zguide,有兴趣慢慢看)

    提升REQ/REP模式的客户端侧可靠性,由于在此模式下,客户端与服务端严格遵循你一下我一下的乒乓规则,当然现实中不可能这么配合,比如服务器突然挂了,客户端就会阻塞在socket.recv(),然后过段时间,服务器又ok了,客户端也自动重连。但是有的场景客户端需要及时知道服务端状况而不是在那一直等,需要返回个错误之类。

    手册提供这种方法:

   Client-side Reliability (Lazy Pirate Pattern)

    不知道作者起这名字有啥含义,海盗?客户端代码:

import sys
import zmq

REQUEST_TIMEOUT = 2500
REQUEST_RETRIES = 3
SERVER_ENDPOINT = "tcp://localhost:5555"

context = zmq.Context(1)

print "I: Connecting to server…"
client = context.socket(zmq.REQ)
client.connect(SERVER_ENDPOINT)

poll = zmq.Poller()
poll.register(client, zmq.POLLIN)

sequence = 0
retries_left = REQUEST_RETRIES
while retries_left:
    sequence += 1
    request = str(sequence)
    print "I: Sending (%s)" % request
    client.send(request)

    expect_reply = True
    while expect_reply:
        socks = dict(poll.poll(REQUEST_TIMEOUT))
        if socks.get(client) == zmq.POLLIN:
            reply = client.recv()
            if not reply:
                break
            if int(reply) == sequence:
                print "I: Server replied OK (%s)" % reply
                retries_left = REQUEST_RETRIES
                expect_reply = False
            else:
                print "E: Malformed reply from server: %s" % reply

        else:
            print "W: No response from server, retrying…"
            # Socket is confused. Close and remove it.
            client.setsockopt(zmq.LINGER, 0)
            client.close()
            poll.unregister(client)
            retries_left -= 1
            if retries_left == 0:
                print "E: Server seems to be offline, abandoning"
                break
            print "I: Reconnecting and resending (%s)" % request
            # Create new connection
            client = context.socket(zmq.REQ)
            client.connect(SERVER_ENDPOINT)
            poll.register(client, zmq.POLLIN)
            client.send(request)

context.term()

    重点是:使用poll.poll(REQUEST_TIMEOUT),来执行一个限时读操作,如果时间段内该REQ socket没收到数据,视作服务端故障,这时就尝试先关闭当前socket,然后重连服务端,重发request。

 

  另外,注意client.setsockopt(zmq.LINGER, 0)设置linger为0,即马上丢掉socket中未处理的消息,否则context,term()啥时能执行完就不知道了。

  模拟一个会出错的服务端:

#coding=utf-8

from random import randint
import time
import zmq

context = zmq.Context(1)
server = context.socket(zmq.REP)
server.bind("tcp://*:5555")

cycles = 0
while True:
    request = server.recv()
    cycles += 1

    # Simulate various problems, after a few cycles
    if cycles > 3 and randint(0, 3) == 0:
        print "I: Simulating a crash"
        break
    elif cycles > 3 and randint(0, 3) == 0:
        print "I: Simulating CPU overload"
        time.sleep(2)
        break

    print "I: Normal request (%s)" % request
    time.sleep(1) # Do some heavy work
    server.send(request)

server.close()
context.term()

   看下运行结果:

服务端:
I: Normal request (1)
I: Normal request (2)
I: Normal request (3)
I: Simulating a crash
[Finished in 5.5s]
客户端:
I: Connecting to server…
I: Sending (1)
I: Server replied OK (1)
I: Sending (2)
I: Server replied OK (2)
I: Sending (3)
I: Server replied OK (3)
I: Sending (4)
No response from server, retrying
Reconnecting and resending (4)
No response from server, retrying
Reconnecting and resending (4)
No response from server, retrying
Server seems to be offline, abandoning
[Finished in 10.7s]

  其实这个也不是提高可靠性吧,只是强化客户端的感知能力。 

 

0
0
分享到:
评论

相关推荐

    Zeromq的异步req/rep模式

    zeromq 的异步demo,简单描述zmq的事例

    ZMQ-REQ\REP模式代码示例

    1. 学习ZMQ_REQ\REP模式 2. 方便自己日后使用

    ZMQ REQ_REP实例

    ZMQ的服务端、客户端小例子,ZMQ使用4.0.4,是最新版本;开发工具是VC2010;编译的程序和使用ZMQ都是x64位版本。希望对学习ZMQ有帮助。运行的时候先打开server,之后启动client;实现了服务端和客户端的简单收发通信...

    Emule Kad 网络分析.doc

    2.1 BootStrap Req/Res 3 2.2 Hello Req/Res 4 2.3 Kad Req/Res 4 2.4 Kad Search/Publish Req/Res 5 2.5 Kad Firewalled Req/Res 6 2.6 Kad FindBuddy Req/Res 6 2.7 kad Callback Req 6 三、KAD Search Action 7 ...

    REP-REQ.zip_Rep和req_zmq_zmq REP_zmq REP REQ_zmq_req

    这是一个zmq的范例代码,可以用来学习rep和req模式

    req_rep.rar

    基于zmqpp的zeromq的请求-响应代码,最简单的模式,也是zeromq最脆弱的模式,必须遵循”发一次请求,接收一次响应“的规则 ,否则程序将陷入无限的等等中;

    ZeroX64 v1.0.rar

    该项目使用VS2013 + libzmq v4.2.4进行Req/Rep、Pub/Sub、Push/Pull这3种通信案例,开发语言为C++,工程士64位的,libzmq的系统位数也是64位。

    nanomsg-req-rep流程源码分析.docx

    nanomsg是一个开源的实现了几种“可扩展协议”的高性能通信库,本文针对请求/回复模式进行了简单的源码分析,包括请求的时序图,socket消息槽等

    zeroMQ/jzmq java例子

    zeroMQ/jzmq java例子,包含基本的req/rep,pub/sub,push/pull以及代理和多数据来源的demo,适合入门了解。

    HR_Management

    人力资源管理人力资源管理API POST Req / hr / login->人力资源登录POST Req / employee / login->员工登录POST Req / hr /:hrId / add-employee->添加员工GET Req / hr /:hrId / employees->查看特定HR下的所有...

    pyzmq-17.1.2-cp36-cp36m-win32

    消息双向的,有来有往,req端请求的消息,rep端必须答复给req端 2. 订阅发布模式 (sub 和 pub) 消息单向的,有去无回的。可按照发布端可发布制定主题的消息,订阅端可订阅喜欢的主题,订阅端只会收到自己已经...

    pino-http:Node用于Node.js的高速HTTP记录器

    http-ndjson (等效信息):7730.73 req / sec http-ndjson (标准最低信息):9522.37 req / sec pino-http :21496 req / sec pino-http (极端):25770.91 req / sec 没有记录器:46139.64 req / sec 所有基准...

    goshare:通过HTTP和ZeroMQ共享您的TimeSeriesNameSpaceKeyVal数据存储(使用leveldb)

    去分享 __ ____ _____ _____/ /_ ____ _________ / __ `/ __ \ / ___/ __ \/ __ `/ ___/ _ \ / /_/ / /_/ / (__ ) / / / /_/ / / / __/ \__, /\____/ /____/_/ /_/\__,_/_/ \___/ ... 基于ZeroMQ REQ / REP的同

    koa-pino-logger::evergreen_tree:Pino日志记录Koa中间件

    基准登录每个请求/响应对,而返回'hello world' ,使用100个连接和流水线设置为1(KOA不能处理流水线): autocannon -c 100 -p 1 http://localhost:3000 。 koa-bunyan-logger :5844 req / sec koa-logger :...

    sandbox-[removed]DAY容器的NodeJS

    SIFT_ROOT运行在此路径中可用的筛选,默认为/run/sandbox/sift IPC_ROOT在此路径中使用Nanomsg req / rep套接字,默认为/run/sandbox/ipc 。 节点序号用作标识,例如DAG中的第一个节点通过/run/sandbox/ipc/0.sock...

    nginx中的limit_req限速设置配置示例

    #以用户二进制IP地址,定义三个漏桶,滴落速率1-3req/sec,桶空间1m,1M能保持大约16000个(IP)状态 limit_req_zone $binary_remote_addr zone=qps1:1m rate=1r/s; limit_req_zone $binary_remote_addr zone=qps2:1m ...

    微信服务器端的sdkwxpay-sdk.zip

    特性:透明封装, Req/Resp交互, 与微信原生文档相通, 学习成本低.一致性接口/工厂模式, 隐藏底层操作, 最短4行代码完成一个请求.多帐号支持/事务隔离, 原生支持平台级应用.扩展能力强, 提供完善demo, 可以独立...

    JZMQ消息队列框架安装配置文档.txt

    //相应的zermq的socket, 比如req, rep, pair, push, pull...等等,本例创建REP类型 3. 绑定到端口 4. 无限循环,等待接受客户端请求 客户端(Hwclient.java) 1. 创建上下文, 初始化一个ZMQ.Context 2. 创建一个socket...

    Python库 | req2toml-1.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:req2toml-1.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    req:制作ubc prereq树

    $ cd req/ $ mkvirtualenv req $ workon req $ pip3 install -r requirements.txt $ add2virtualenv . $ npm install 用法 将鼠标悬停在课程上可以查看其信息。 单击以关闭悬停框。 再次单击以将课程切换为已完成或...

Global site tag (gtag.js) - Google Analytics