我正在用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()的结果,如果是的话,我是否可以将结果聚合到一组订户节点。
P.S.可能是我看错方向了,应该使用其他的通信技术吗?
发布于 2013-11-16 11:56:53
Publisher->订户模式是一种单向通信模式。这是实现非托管工作项分发的好方法,但是如果您想要双向通信或更多地控制工作分布(负载平衡等),则需要另一个通信渠道。
根据我所掌握的关于您要做的事情的信息,有两种高级解决方案可供您使用:
一个网关后面的服务器节点黑匣子
请求-回复代理模式
“使用request-reply broker可以使客户机/服务器体系结构更易于扩展,因为客户端看不到工作人员,而工作人员看不到客户端。唯一的静态节点是中间的代理。”

有关此模式的更多信息,请参见这里的ZMQ指南中的代码示例。
用简单的REQ<->REP实现您自己的多播
使用典型的客户端<->服务器模型(REQ<->REP)进行连接,并在自己的代码中实现多播。
我不能说哪种解决方案是最好的,因为您知道应用程序最需要哪种解决方案,而这只是两个常见的解决方案。有许多实现ZMQ的方法,而且它几乎可以以任何您希望的方式实现。通常最重要的是在高级别上设计一个好的管道,然后回到ZMQ为您做艰苦的工作。
https://stackoverflow.com/questions/19955976
复制相似问题