zeroMQ初体验-11.节点间的协作

本文介绍如何使用ZeroMQ的发布/订阅模式结合应答模式解决初始连接不稳定的问题,确保所有订阅者都能接收到完整消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇讲到了线程间的协作,通过zeroMQ的pair模式可以很优雅的实现。而在各节点间(进程级),则适用度不高(虽然也能用)。这里给出了两个理由:
1.节点间是可以调节的,而线程间不是(线程是稳定的),pair模式是非自动连接的.
2.线程数是固定的,可预估的。而节点则是变动、不可预估的。
由此得出结论:pair适用于稳定、可控的环境。

所以,有了本章节。不知诸位还记得前面所讲的[url=http://iyuan.iteye.com/blog/973013]发布/订阅模式[/url],在那里曾说过这种模式是不太稳定的(主要是指初始阶段),容易在连接未建立前就发布、废弃部分数据。在这里,通过节点间的协作来解决那个难题。

模型图:
[img]http://github.com/imatix/zguide/raw/master/images/fig23.png[/img]

发布端:

import zmq

SUBSCRIBERS_EXPECTED = 2

def main():
    context = zmq.Context()
    
    publisher = context.socket(zmq.PUB)
    publisher.bind('tcp://*:5561')

    syncservice = context.socket(zmq.REP)
    syncservice.bind('tcp://*:5562')

    subscribers = 0
    while subscribers < SUBSCRIBERS_EXPECTED:
        msg = syncservice.recv()
        syncservice.send('')
        subscribers += 1
        print "+1 subscriber"
    
    for i in range(1000000):
       publisher.send('Rhubarb');

    publisher.send('END')

if name == 'main':
    main()


订阅端:

import zmq

def main():
    context = zmq.Context()
    
    subscriber = context.socket(zmq.SUB)
    subscriber.connect('tcp://localhost:5561')
    subscriber.setsockopt(zmq.SUBSCRIBE, "")

    syncclient = context.socket(zmq.REQ)
    syncclient.connect('tcp://localhost:5562')
    
    syncclient.send('')
    
    syncclient.recv()

    nbr = 0
    while True:
        msg = subscriber.recv()
        if msg == 'END':
            break
        nbr += 1
    
    print 'Received %d updates' % nbr

if name == 'main':
    main()


由上例可见,通过应答模式解决了之前的困扰,如果还不放心的话,也可以通过发布特定参数,当订阅端得到时再应答,安全系数便又升了一级。不过这里有个大前提,得先通过某种方式得到或预估一个概念数来确保应用的可用性。

(未完待续)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值