ZeroRPC发布/订阅聚合结果

时间:2013-11-13 14:13:01

标签: python rpc zeromq distributed-computing publish-subscribe

我在python中设计一个简单的分布式数据库。我考虑使用 ZeroRPC 实现通信层。密钥查找由DHT协议以 req / rep 模式实现。但是,我还希望能够通过密钥的值进行分布式查找。例如,如果我请求具有特定值的密钥,我希望所有服务器在其本地存储中执行查找,然后将结果返回给请求者。我正在考虑用 pub / sub 实现这个的可能性,如下所示:

    #node.py
    import zerorpc
    class Node:
        def query(param):
            #lookup code
            return result # could be None or [], etc.

    sub = zerorpc.Subscriber(Node())
    sub.connect('tcp://127.0.0.1:9999')
    sub.run()


    #requester.py
    import zerorpc

    pub = zerorpc.Publisher()
    pub.bind('tcp://127.0.0.1:9999')

    result = pub.query('foo_query') # None
    print result # None

问题是,我是否可以获得调用pub.query()的结果?如果是,我可以从一堆订阅者节点聚合该结果。

P.S。可能我正在寻找错误的方向,应该使用其他一些沟通技巧吗?

1 个答案:

答案 0 :(得分:1)

发布商 - >订阅者模式是单向通信模式。它是实现非托管工作项分发的好方法,但如果您需要双向通信或更多地控制工作分配(负载平衡等),则需要另一个通信通道。

根据我对您要做的事情的信息,您可以使用两种高级解决方案:

Blackbox单个网关后面的服务器节点

<强> Request-Reply Broker Pattern

“使用请求 - 回复代理使您的客户端/服务器体系结构更容易扩展,因为客户端看不到工作者,而工作者也看不到客户端。唯一的静态节点是中间的代理。”

enter image description here

使用the ZMQ Guide here中的代码示例详细了解此模式。

使用简单的REQ&lt; - &gt; REP

实现您自己的多播

使用典型的客户端&lt; - &gt;服务器模型(REQ&lt; - &gt; REP)进行连接,并在您自己的代码中实现多播功能。

我不知道哪种解决方案最好,因为您知道您的应用程序需求最好,而这些只是两种常见的解决方案。有许多方法可以实现ZMQ,它可以以您希望的任何方式实现。通常最重要的是设计一个高水平的好管道,然后回到ZMQ为你做艰苦的工作。