我正在用python设计一个简单的分布式数据库。我考虑用ZeroRPC
实现一个通信层。密钥查找由DHT协议实现,采用req/rep模式。但是,我也希望能够根据键的值进行分布式查找。例如,如果我请求一个具有特定值的键,我希望所有服务器在其本地存储中执行查找,然后将结果返回给请求者。我正在考虑通过发布/订阅来实现这一点,类似于:
#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.可能是我找错方向了,应该使用其他一些沟通技巧吗?在
发布者->订阅服务器模式是单向通信模式。这是实现非托管工作项分发的一个好方法,但是如果您希望双向通信或对工作分配(负载平衡等)有更多的控制,则需要另一个通信通道。在
根据我掌握的有关您正在尝试做什么的信息,您可以使用两种高级解决方案:
Blackbox单个网关后面的服务器节点
Request-Reply Broker Pattern
“使用请求-应答代理使客户机/服务器体系结构更易于扩展,因为客户端看不到工作线程,而工作线程也看不到客户端。唯一的静态节点是中间的代理。
通过the ZMQ Guide here中的代码示例了解更多关于此模式的信息。在
使用简单的REQ<;->;REP实现您自己的多播
使用典型的客户机<;->;服务器模型(REQ<;->;REP)进行连接,并在您自己的代码中实现多播。在
我不能说哪种解决方案是最好的,因为您知道您的应用程序最需要,这只是两种常见的解决方案。实现ZMQ的方法有很多种,而且它几乎可以以您希望的任何方式实现。通常最重要的是在高层设计一个好的管道,然后回到ZMQ为您做艰苦的工作。在
相关问题 更多 >
编程相关推荐