我在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。可能我正在寻找错误的方向,应该使用其他一些沟通技巧吗?
答案 0 :(得分:1)
发布商 - >订阅者模式是单向通信模式。它是实现非托管工作项分发的好方法,但如果您需要双向通信或更多地控制工作分配(负载平衡等),则需要另一个通信通道。
根据我对您要做的事情的信息,您可以使用两种高级解决方案:
<强> Request-Reply Broker Pattern 强>
“使用请求 - 回复代理使您的客户端/服务器体系结构更容易扩展,因为客户端看不到工作者,而工作者也看不到客户端。唯一的静态节点是中间的代理。”
使用the ZMQ Guide here中的代码示例详细了解此模式。
使用典型的客户端&lt; - &gt;服务器模型(REQ&lt; - &gt; REP)进行连接,并在您自己的代码中实现多播功能。
我不知道哪种解决方案最好,因为您知道您的应用程序需求最好,而这些只是两种常见的解决方案。有许多方法可以实现ZMQ,它可以以您希望的任何方式实现。通常最重要的是设计一个高水平的好管道,然后回到ZMQ为你做艰苦的工作。