(原文在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]
其实这个也不是提高可靠性吧,只是强化客户端的感知能力。
相关推荐
zeromq 的异步demo,简单描述zmq的事例
1. 学习ZMQ_REQ\REP模式 2. 方便自己日后使用
ZMQ的服务端、客户端小例子,ZMQ使用4.0.4,是最新版本;开发工具是VC2010;编译的程序和使用ZMQ都是x64位版本。希望对学习ZMQ有帮助。运行的时候先打开server,之后启动client;实现了服务端和客户端的简单收发通信...
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 ...
这是一个zmq的范例代码,可以用来学习rep和req模式
基于zmqpp的zeromq的请求-响应代码,最简单的模式,也是zeromq最脆弱的模式,必须遵循”发一次请求,接收一次响应“的规则 ,否则程序将陷入无限的等等中;
该项目使用VS2013 + libzmq v4.2.4进行Req/Rep、Pub/Sub、Push/Pull这3种通信案例,开发语言为C++,工程士64位的,libzmq的系统位数也是64位。
nanomsg是一个开源的实现了几种“可扩展协议”的高性能通信库,本文针对请求/回复模式进行了简单的源码分析,包括请求的时序图,socket消息槽等
zeroMQ/jzmq java例子,包含基本的req/rep,pub/sub,push/pull以及代理和多数据来源的demo,适合入门了解。
人力资源管理人力资源管理API POST Req / hr / login->人力资源登录POST Req / employee / login->员工登录POST Req / hr /:hrId / add-employee->添加员工GET Req / hr /:hrId / employees->查看特定HR下的所有...
消息双向的,有来有往,req端请求的消息,rep端必须答复给req端 2. 订阅发布模式 (sub 和 pub) 消息单向的,有去无回的。可按照发布端可发布制定主题的消息,订阅端可订阅喜欢的主题,订阅端只会收到自己已经...
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 所有基准...
去分享 __ ____ _____ _____/ /_ ____ _________ / __ `/ __ \ / ___/ __ \/ __ `/ ___/ _ \ / /_/ / /_/ / (__ ) / / / /_/ / / / __/ \__, /\____/ /____/_/ /_/\__,_/_/ \___/ ... 基于ZeroMQ REQ / REP的同
基准登录每个请求/响应对,而返回'hello world' ,使用100个连接和流水线设置为1(KOA不能处理流水线): autocannon -c 100 -p 1 http://localhost:3000 。 koa-bunyan-logger :5844 req / sec koa-logger :...
SIFT_ROOT运行在此路径中可用的筛选,默认为/run/sandbox/sift IPC_ROOT在此路径中使用Nanomsg req / rep套接字,默认为/run/sandbox/ipc 。 节点序号用作标识,例如DAG中的第一个节点通过/run/sandbox/ipc/0.sock...
#以用户二进制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 ...
特性:透明封装, Req/Resp交互, 与微信原生文档相通, 学习成本低.一致性接口/工厂模式, 隐藏底层操作, 最短4行代码完成一个请求.多帐号支持/事务隔离, 原生支持平台级应用.扩展能力强, 提供完善demo, 可以独立...
//相应的zermq的socket, 比如req, rep, pair, push, pull...等等,本例创建REP类型 3. 绑定到端口 4. 无限循环,等待接受客户端请求 客户端(Hwclient.java) 1. 创建上下文, 初始化一个ZMQ.Context 2. 创建一个socket...
资源分类:Python库 所属语言:Python 资源全名:req2toml-1.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
$ cd req/ $ mkvirtualenv req $ workon req $ pip3 install -r requirements.txt $ add2virtualenv . $ npm install 用法 将鼠标悬停在课程上可以查看其信息。 单击以关闭悬停框。 再次单击以将课程切换为已完成或...