我正在开发使用大规模分布式细胞自动机的模拟。细胞模拟分布在节点上并使用ZooKeeper进行协调。持久性数据存储在Riak中。细胞自动机本身是用Python编写的。
如果一个小区可以将一个低音量(比如说几秒到几十秒)的消息(可能是键值对)传递给它的近邻(曼哈顿邻域),那么我的模拟将非常方便。然而,对于数百万个小区的模拟,这种天真的方法最终会有数百万个小邮箱,每个小区一个邮箱,以及每个盒子中缓慢的消息。这让ZooKeeper或RabbitMQ岌岌可危! I've been recommended DDS,但它看起来非常像Enterprise,而且我找不到任何Python绑定。
我是分布式系统开发的新手 - 这真的只是一个爱好项目,看看我能走多远。我不禁感到我正在以错误的方式解决这个问题,转向每个小小区邮箱的单片消息总线。一个单元很容易确定它的邻居和它在世界上的位置,所以看起来消息传递应该容易受到某种分块的影响。然而,这个区域演员的设计以及它与单个单元的通信方式让我感到惊讶。我看到单元格如何通过消息总线将消息传递给块,但是块如何将消息传递回单元?
我是否真正解决了这个问题?分布式节点将低容量消息传递给其邻居的正确方法是什么?
答案 0 :(得分:1)
我不确定你需要这些消息多么持久;根据您的描述,您似乎没有任何来自不同单元格的消息的排序约束。我认为你做想要从同一个小区a发送到同一个小区的所有消息的总排序b。
ZooKeeper被淹没,因为它在所有邮件上提供全局总排序。我不确定您的系统通过Zookeeper确切需要什么类型的协调,但它最适合 course-grained 协调而不是细粒度协调。 (我工作的地方,我们分别称这个角色锁定和资源锁定来澄清意图。工作者扮演角色而不是锁定资源。)
所以,这里有一些关于我有什么信息的想法。
如果消息不需要持久,最好的方法是保持与邻居的连接并将消息直接发送给他们。我假设是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的架构(过去和现在),因为它们基本上有数百万个邮箱,每个邮箱都有一个(也就是人)。
答案 1 :(得分:0)
我正在玩弄一个想法:
我已经在几个地方读过使用ZooKeeper作为内部系统DNS的替代方案。由于模拟工作进程已经向ZooKeeper注册了他们负责的单元模拟,我想它不应该太远,也不能注册他们将响应的IP和端口,然后使用ZeroMQ设置单元之间的P2P消息传递。这仍然是一个粗略的草图。