`
iyuan
  • 浏览: 474422 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zeroMQ初体验-9.优雅的扩展(代理模式)

    博客分类:
  • MQ
阅读更多
前面所谈到的网络拓扑结构都是这样的:


而在实际的应用中,绝大多数会出现这样的结构要求:


zeroMQ中自然也提供了这样的需求案例:

1.发布/订阅 代理模式:
import zmq

context = zmq.Context()

frontend = context.socket(zmq.SUB)
frontend.connect("tcp://192.168.55.210:5556")

backend = context.socket(zmq.PUB)
backend.bind("tcp://10.1.1.0:8100")

frontend.setsockopt(zmq.SUBSCRIBE, '')

while True:
    while True:
        message = frontend.recv()
        more = frontend.getsockopt(zmq.RCVMORE)
        if more:
            backend.send(message, zmq.SNDMORE)
        else:
            backend.send(message)
            break # Last message part

注意代码,这个代理是支持大数据多包发送的。这个proxy实现了下图:


2.请求/答复 代理模式:
因为zeroMQ天然支持"多对多",所以看似不需要代理啊,如下图:


不过,这样会有一个问题,客户端需要知道所有的服务地址,并且在服务地址出现变迁时,需要通知客户端,这样迁移扩展的复杂度将无法预估。故,需要实现下图:

客户端:
import zmq

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5559")

for request in range(1,10):
    socket.send("Hello")
    message = socket.recv()
    print "Received reply ", request, "[", message, "]"


服务器端:
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.connect("tcp://localhost:5560")

while True:
    message = socket.recv()
    print "Received request: ", message
    socket.send("World")


代理端:
import zmq

context = zmq.Context()
frontend = context.socket(zmq.XREP)
backend = context.socket(zmq.XREQ)
frontend.bind("tcp://*:5559")
backend.bind("tcp://*:5560")

poller = zmq.Poller()
poller.register(frontend, zmq.POLLIN)
poller.register(backend, zmq.POLLIN)

while True:
    socks = dict(poller.poll())

    if socks.get(frontend) == zmq.POLLIN:
        message = frontend.recv()
        more = frontend.getsockopt(zmq.RCVMORE)
        if more:
            backend.send(message, zmq.SNDMORE)
        else:
            backend.send(message)

    if socks.get(backend) == zmq.POLLIN:
        message = backend.recv()
        more = backend.getsockopt(zmq.RCVMORE)
        if more:
            frontend.send(message, zmq.SNDMORE)
        else:
            frontend.send(message)


上面的代码组成了下面的网络结构:


客户端与服务器端互相透明,世界一下清净了...

这节上了好多图和代码,绝对都是干货。不过,既然0mq已经想到了,为毛还要咱自己写代理捏?So,虽然上面的都是干货,或许,马上,就可以统统忘掉了。下面,展示下0mq自带的代理方案:
import zmq

def main():    
    context = zmq.Context(1)
    
    frontend = context.socket(zmq.XREP)
    frontend.bind("tcp://*:5559")
    
    backend  = context.socket(zmq.XREQ)
    backend.bind("tcp://*:5560")
    
    zmq.device(zmq.QUEUE, frontend, backend)
    
    frontend.close()
    backend.close()
    context.term()
    
if __name__ == "__main__":
    main()

这是应答模式的代理,官方提供了三种标准代理:
应答模式:queue XREP/XREQ
订阅模式:forwarder SUB/PUB
分包模式:streamer PULL/PUSH

特别提醒:
官方可不推荐代理混搭,不然责任自负。按照官方的说法,既然要混搭,还是自个儿写代理比较靠谱~

(未完待续)
分享到:
评论
2 楼 iyuan 2011-12-16  
guozhiwei 写道
请问下 代理模式的 代理结点的  单点问题怎么能很好的解决呢

通常的场景是:proxy-a:1,2;proxy-b:1,2。全局上看代理就可以避免单点,不过局部点对于使用proxy-a的client而言,代理仍然是唯一单点的.从纯逻辑的角度来讲,只能从client端入手解决代理单点,即绑定多个代理地址(前提是不需要担心client知道的太多~)。
具体方案的选择要看具体业务及运营的情况,并不存在什么万能法门。
1 楼 guozhiwei 2011-12-16  
请问下 代理模式的 代理结点的  单点问题怎么能很好的解决呢

相关推荐

    zeromq-2.1.7.tar.gz

    zeromq-2.1.7 是 ZeroMQ 的一个较早版本,ZeroMQ 是一个开源的消息中间件,它提供了一种高效、灵活的框架来构建分布式应用。在Linux环境中,ZeroMQ通过消息队列机制实现了进程间的通信,使得数据可以在不同程序之间...

    zeromq-3.2.5.tar.gz、jzmq.tar.gz、Python-2.6.6.tar.bz2、storm-0.8.0.zip下载

    这里提供的四个压缩包文件,Python-2.6.6.tar.bz2、zeromq-3.2.5.tar.gz、jzmq.tar.gz以及storm-0.8.0.zip,都是与Storm搭建和运行相关的资源。 首先,我们来详细了解一下每个文件的作用: 1. **Python-2.6.6.tar....

    zeromq-4.0.3.tar.gz.zip

    zeromq-4.0.3.tar.gz 是一个包含了 ZeroMQ 4.0.3 版本源代码的压缩文件。ZeroMQ,也被称为“零消息队列”或“0MQ”,是一个开源的消息中间件,它提供了一种高效、灵活且可扩展的方式来处理分布式系统中的数据通信。...

    zeromq-4.1.8.tar.gz

    总的来说,zeromq-4.1.8.tar.gz是ZeroMQ的一个源码版本,开发者可以通过编译安装来使用这个库,以构建高效、可扩展的网络通信解决方案。结合不同编程语言的绑定,可以轻松地将ZeroMQ集成到各种项目中,实现强大的...

    zeromq-4.2.3.tar.gz

    总结来说,zeromq-4.2.3.tar.gz是一个包含了ZeroMQ稳定版本源代码的压缩包,它提供了强大的消息队列和跨进程通信能力,适用于构建高可用、可扩展的分布式系统。在Linux环境下,你可以通过编译安装这个源代码包,然后...

    zeromq-2.1.9.tar.gz

    `zeromq-2.1.9.tar.gz` 是zeromq的一个特定版本,即2.1.9版,通常以源码形式提供,需要通过编译来安装。 首先,让我们深入了解zeromq的核心概念。zeromq设计了一个灵活的套接字模型,它允许开发者构建复杂的网络...

    zeromq-4.1.3.tar.gz

    zeromq-4.1.3 是一个针对 ZeroMQ 的特定版本的开发工具包,ZeroMQ 是一个开源的消息中间件库,它为分布式计算提供了一种高性能、轻量级的通信框架。ZeroMQ 提供了多种编程语言的绑定,使得开发者能够方便地在不同的...

    zeromq-4.0.5-4.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    zeromq-4.3.4.tar.gz

    这个“zeromq-4.3.4.tar.gz”文件是0MQ库的4.3.4稳定版本,发布于2021年1月17日。下面我们将深入探讨0MQ的核心特性、主要功能以及如何使用这一版本。 1. **0MQ简介** - 0MQ不是一个传统的消息队列系统,而是一种在...

    zeromq-4.3.4.zip

    标题中的"zeromq-4.3.4.zip"指的是这个库的4.3.4版本的源代码压缩包。这个稳定版在2021年1月17日发布,意味着它是经过多轮测试和优化后的成熟版本,适合用于生产环境。 0MQ的核心特性包括: 1. **轻量级**:0MQ不...

    zeromq-4.2.0.tar.gz源码包

    zeromq是一个强大的开源消息中间件,它提供了一种高效、灵活且可扩展的方式来处理分布式系统中的消息通信。zeromq的核心理念是提供一个抽象层,使得开发者可以专注于编写业务逻辑,而无需关心底层网络通信的复杂性。...

    zeromq-4.2.0.tar.zip

    标题中的"zeromq-4.2.0.tar.zip"是指ZeroMQ库的4.2.0版本,它被封装在一个ZIP压缩包中,而内部包含的文件是tar归档格式。ZeroMQ是一个开源的消息中间件,它提供了一个高级的消息队列模型,允许应用程序之间进行高效...

    zeromq-3.2.5.tar.gz

    ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...

    zeromq-4.1.4.tar.gz

    ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...

    zeromq-4.1.2.tar.gz

    ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。

    zeromq-4.1.0-rc1.zip

    综上所述,“zeromq-4.1.0-rc1.zip”压缩包中的源代码提供了ZeroMQ的一个关键版本,开发者可以深入了解其内部机制,根据项目需求进行定制或扩展。对于想要构建分布式系统,特别是对性能和灵活性有高要求的项目来说,...

    zeromq-4.3.2.tar.gz

    在Linux环境下,zeromq-4.3.2.tar.gz可以通过编译源代码进行安装。通常,这涉及到解压、配置、编译和安装几个步骤。用户需要确保系统上已经安装了必要的构建工具,如GCC、make和必要的依赖库。安装过程可能如下: `...

    zeromq-3.12.5.zip

    zeromq-3.12.5.tar.gz, libzmq-3.1.2.tar.gz 在Linux环境中,构建和部署分布式计算系统时,Storm是一个常用的选择,它是一个开源的流处理框架,用于实时数据处理。这个压缩包"zeromq-3.12.5.zip"包含了与Storm集群...

    zeromq-4.0.1.tar.gz

    这个“zeromq-4.0.1.tar.gz”文件是ZeroMQ的4.0.1版本源代码包,适用于那些需要在网络通信、并发处理或构建微服务架构的开发者。由于从官方网站下载可能速度较慢,此压缩包提供了方便的下载渠道。 ZeroMQ的核心特性...

    Win64-ZeroMQ-JZMQ-CZMQ.zip

    VS2015 在Widows 10 上编译的 ZeroMQ 4.3.2,JZMQ 3.1 CZMQ 4.2,可以在 JDK 1.8 下运行。DLL 都是 64位,包含了编译及运行相关信息。分享一下,也给自己留个备份

Global site tag (gtag.js) - Google Analytics