我正在开发一个使用大规模分布式元胞自动机的模拟。单元模拟分布在节点上,并使用ZooKeeper进行协调。持久数据存储在Riak中。细胞自动机本身是用Python编写的。
如果一个单元可以向它的直接邻居(曼哈顿附近)传递少量(比方说每秒几到几十个)消息(可能是键值对),这对于我的模拟将是非常方便的。然而,对于数百万个细胞的模拟,天真的方法最终得到了数百万个小邮箱,每个细胞一个邮箱,消息缓慢地流入每个盒子。这让ZooKeeper或RabbitMQ陷入了低谷!I've been recommended DDS,但它看起来非常像企业版,而且我找不到任何Python绑定。
我是分布式系统开发的新手--这只是一个业余爱好项目,看看我能走多远。我不禁觉得我走错了路,为每个小单元的邮箱转向了单片消息总线。细胞很容易确定它的邻居和它在世界上的位置,所以消息传递似乎应该受到某种分块的影响。然而,我无法理解这个区域参与者的设计以及它如何与单个细胞进行通信。我看到了单元如何通过消息总线将消息传递到块,但是块如何将消息传递回单元?
我是否接近了这个问题的真正解决方案?分布式节点向其邻居传递低容量消息的正确方式是什么?
发布于 2013-03-16 14:04:00
我不确定您需要这些消息的持久性;根据您的描述,您似乎对来自不同单元的消息没有任何排序约束。我认为您确实想要从相同的小区a发送到相同的小区b的所有消息的总排序。
ZooKeeper会被淹没,因为它提供了所有消息的全局总排序。我不确定您的系统需要通过Zookeeper进行哪种类型的协调,但它使用过程粒度的协调比细粒度的协调效果更好。(在我工作的地方,我们将这个角色分别称为锁定和资源锁定,以阐明意图。工作人员承担角色,而不是锁定资源。)
所以,这里有一些关于我所掌握的信息的想法。
如果消息不需要持久,最好的方法是保持与邻居的连接,并将消息直接发送给他们。我假设是2D或3D,所以(曼哈顿)邻居的数量很少。
本文的其余部分将假定您需要持久性。
单个消息队列系统应该能够处理数百万条消息;但如果对它们进行一定程度的分区,它们会获得更好的性能。
首先,请尝试将所有消息发送到同一队列。让一些工作者(由ZooKeeper选择)将消息从队列中拉出,并将它们发送到它们的目标单元(在进入队列之前,需要单元中的ack )。您还可以让一组工作人员从单元接收消息,并将其放入队列。基本上,这有助于队列上的争用。
[ Router ]--->[ Queue ]--->[ Router ]
^ ^ ^ | | |
| | | V V V
[A] [B] [C] [D] [E] [F]现在,您可以对此进行一些推广,并为每个区域创建一个队列。(当队列需要处理的消息较少时,它们的工作效果会更好。)每个区域有一台或多台路由器。
,----->[ QueueA ]<------.
| | (Note which arrows are bi-directional)
V |
[ RouterA ]--->[ QueueB ]<--->[ RouterB ]
^ ^ ^ ^ ^ ^
| | | | | |
V V V V V V
[A] [B] [C] [D] [E] [F]如果消息传递系统仍然不堪重负,您可以将上图中的队列替换为整个消息队列系统。
这些是一些简单的想法,不知道实际的领域,希望能为你指明一个好的方向。
顺便说一句,你可能想研究一下Twitter的架构(过去和现在),因为他们基本上有数百万个邮箱,每个细胞自动机(也就是人)一个邮箱。
发布于 2013-03-18 05:37:49
我正在考虑的一个想法是:
我在几个地方读到人们使用ZooKeeper作为内部系统的域名系统的替代方案。由于模拟工作者进程已经向ZooKeeper注册了它们负责的单元模拟,因此我认为也可以注册它们将响应的IP和端口,然后使用ZeroMQ设置在单元之间传递P2P消息。这仍然是一个粗略的草图。
https://stackoverflow.com/questions/15035259
复制相似问题