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

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
分享到:
评论

相关推荐

    PyPI 官网下载 | pyzmq-22.1.0-cp37-cp37m-manylinux1_i686.whl

    6. **ZeroMQ Features**:包括流控制、负载均衡、故障恢复、消息持久化等特性,提升了系统的可靠性。 在实际开发中,`pyzmq`常用于构建分布式系统,如数据处理管道、实时数据流分析、高并发服务等场景。例如,它...

    Python库 | pyzmq-22.0.1-cp39-cp39-win_amd64.whl

    Socket类型包括PUB(发布者)、SUB(订阅者)、REQ(请求者)、REP(应答者)、DEALER(经销商)、ROUTER(路由器)等,每种类型对应不同的消息模式。 2. **Context(上下文)**:管理多个Socket,提供线程池和连接...

    zeromq 中文教程Python版本.pdf.zip

    - **对等(PAIR)**:两个套接字之间进行一对一通信,用于低延迟、高可靠性的连接。 - **推送-拉取(PUSH-PULL)**:生产者推送消息,消费者拉取。适用于负载均衡和数据处理流水线。 4. **Python代码示例**: - ...

    pyzmq-16.0.2.tar.gz

    然后,可以创建各种类型的`Socket`,如`PUB`(发布者)、`SUB`(订阅者)、`REQ`(请求者)和`REP`(响应者)等,以实现不同的通信模式。比如,创建一个请求/响应模式的Socket: ```python socket = context.socket...

    python zeromq

    2. **Pattern(模式)**:ZeroMQ支持多种通信模式,包括PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、PUSH/PULL(推/拉)和DEALER/ROUTER(经销商/路由器)。这些模式覆盖了大部分常见的消息传递需求。 3. **...

    libzmq.dll /libzmq.lib/zmq.h 文件 用于zmq的 windows开发环境

    9. **安全性与可靠性**:虽然zmq本身不直接提供加密和认证功能,但它可以与SSL/TLS等安全协议集成,以确保通信的安全性和可靠性。 通过了解这些知识点,开发者可以更好地理解和使用zmq在Windows环境中进行开发,...

    消息队列zeromq4.1.8版本安装包

    Socket是通信的基本单元,提供了多种模式,如PUB(发布者)/SUB(订阅者)、REQ(请求者)/REP(响应者)、DEALER(经销商)/ROUTER(路由器)等,这些模式对应不同的通信模式,满足不同的应用场景。Context则是一个...

    jzmq.tar.gz

    ZeroMQ支持多种传输协议,如TCP、UDP、PUB/SUB、PAIR、REQ/REP等,以及临时网络结构如管道和临时端点。 jzmq是ZeroMQ在Java中的绑定,使得Java开发者也能利用ZeroMQ的强大功能。它提供了与C++版本ZeroMQ接口类似的...

    ZeroMQ初体验.rar_ZeroMQ初体验_zeromq

    2. **创建插座**:在程序中创建ZeroMQ插座,指定其类型,如PUB(发布者)、SUB(订阅者)、REQ(请求者)或REP(应答者)等。 3. **绑定与连接**:发布者绑定到一个地址,订阅者或请求者连接到该地址。这定义了消息...

    zeromq-4.2.3.tar.gz

    1. **套接字(Sockets)**:在ZeroMQ中,套接字不仅仅是传统网络编程中的概念,它们提供了多种模式,如PUB(发布者)、SUB(订阅者)、REQ(请求者)、REP(响应者)、DEALER(经销商)和ROUTER(路由器),这些模式...

    ZMQ安装包V4.3.4

    **正文** ZMQ,全称为ZeroMQ,是一个开源的消息中间件库,它为开发者提供了高效、灵活的异步消息通信框架。ZeroMQ的设计目标是简化分布式系统中的消息...正确安装和使用ZMQ,能够极大地提升系统的可扩展性和可靠性。

Global site tag (gtag.js) - Google Analytics