1

我正在用python设计一个简单的分布式数据库。我考虑用ZeroRPC. 密钥查找由具有req/rep模式的 DHT 协议实现。但是,我还希望能够通过键的值进行分布式查找。例如,如果我请求具有特定值的键,我希望所有服务器在其本地存储中进行查找,然后将结果返回给请求者。我正在考虑用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()?如果可以,我可以从一堆订阅者节点中聚合结果吗?

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

4

1 回答 1

1

Publisher->Subscriber 模式是一种单向通信模式。这是实现非托管工作项分配的好方法,但如果您想要双向通信或对工作分配(负载平衡等)进行更多控制,则需要另一个通信渠道。

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

黑箱化单个网关后面的服务器节点

请求-回复代理模式

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

在此处输入图像描述

在此处的 ZMQ 指南中通过代码示例查看有关此模式的更多信息。

使用简单的 REQ<->REP 实现您自己的多播

使用典型的客户端<->服务器模型 (REQ<->REP) 进行连接,并在您自己的代码中实现多播工作。

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

于 2013-11-16T11:56:53.997 回答