针对大规模分布式细胞自动机的本地,低容量消息传递

时间:2013-02-22 23:58:05

标签: message-queue messaging distributed-system cellular-automata distributed-objects

我正在开发使用大规模分布式细胞自动机的模拟。细胞模拟分布在节点上并使用ZooKeeper进行协调。持久性数据存储在Riak中。细胞自动机本身是用Python编写的。

如果一个小区可以将一个低音量(比如说几秒到几十秒)的消息(可能是键值对)传递给它的近邻(曼哈顿邻域),那么我的模拟将非常方便。然而,对于数百万个小区的模拟,这种天真的方法最终会有数百万个小邮箱,每个小区一个邮箱,以及每个盒子中缓慢的消息。这让ZooKeeper或RabbitMQ岌岌可危! I've been recommended DDS,但它看起来非常像Enterprise,而且我找不到任何Python绑定。

我是分布式系统开发的新手 - 这真的只是一个爱好项目,看看我能走多远。我不禁感到我正在以错误的方式解决这个问题,转向每个小小区邮箱的单片消息总线。一个单元很容易确定它的邻居和它在世界上的位置,所以看起来消息传递应该容易受到某种分块的影响。然而,这个区域演员的设计以及它与单个单元的通信方式让我感到惊讶。我看到单元格如何通过消息总线将消息传递给块,但是块如何将消息传递回单元?

我是否真正解决了这个问题?分布式节点将低容量消息传递给其邻居的正确方法是什么?

2 个答案:

答案 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消息传递。这仍然是一个粗略的草图。