我一直在阅读《算法导论》,开始在脑海中涌现出一些想法和问题。其中最困扰我的是如何设计一个分布式队列调度算法。
我的思路引导我浏览了维基百科上的一些主题,例如排序、消息队列、调度、分布式哈希表等等。
场景如下:假设你想要拥有一个排队系统,用于排列消息(例如字符串或某些序列化对象)。此系统的一个关键特性是避免任何单点故障。该系统必须分布在某个集群内的多个节点上,并且必须始终尽可能平衡集群内每个节点的工作负载,以避免热点。
您希望避免使用主/从复制和扩展的设计(没有单点故障)。该系统完全避免写入磁盘,并维护内存数据结构。
由于这是一个队列,因此该系统应能够使用各种调度算法(FIFO、最早截止时间、轮询等)来确定哪个消息应在下一个请求上返回,而不管请求是在集群中的哪个节点上发起的。
我的初始想法是,我可以想象这在单个机器上如何工作,但当我开始考虑如何分发这样的东西时,就会产生一些问题,比如:
如何对每个消息进行哈希?
如何知道消息发送到了哪个节点?
如何安排每个项目,以便我可以确定下一个应返回哪个节点的哪个消息?
我开始阅读有关分布式哈希表的内容,以及像Apache Cassandra这样的项目如何使用某种一致性哈希来分发数据,但后来我想,由于查询不会提供密钥,我需要知道下一个项在哪里,然后才能提供它...
这进一步引导我阅读点对点协议以及它们如何跨节点处理同步问题。
所以我的问题是,你会如何解决上述描述的问题,或者这太牵强附会了,只是一个愚蠢的想法...?
简要概述、指针、不同的方法、各自的优缺点。可能适用的技术/概念/设计/理论。基本上任何有助于理解这样的东西如何工作的东西。
如果你想知道,不,我并不打算实现任何类似的东西,只是在阅读时突然想到的(这种情况经常发生,当我读一本好书时会被狂野的想法分心)。
我的思路引导我浏览了维基百科上的一些主题,例如排序、消息队列、调度、分布式哈希表等等。
场景如下:假设你想要拥有一个排队系统,用于排列消息(例如字符串或某些序列化对象)。此系统的一个关键特性是避免任何单点故障。该系统必须分布在某个集群内的多个节点上,并且必须始终尽可能平衡集群内每个节点的工作负载,以避免热点。
您希望避免使用主/从复制和扩展的设计(没有单点故障)。该系统完全避免写入磁盘,并维护内存数据结构。
由于这是一个队列,因此该系统应能够使用各种调度算法(FIFO、最早截止时间、轮询等)来确定哪个消息应在下一个请求上返回,而不管请求是在集群中的哪个节点上发起的。
我的初始想法是,我可以想象这在单个机器上如何工作,但当我开始考虑如何分发这样的东西时,就会产生一些问题,比如:
如何对每个消息进行哈希?
如何知道消息发送到了哪个节点?
如何安排每个项目,以便我可以确定下一个应返回哪个节点的哪个消息?
我开始阅读有关分布式哈希表的内容,以及像Apache Cassandra这样的项目如何使用某种一致性哈希来分发数据,但后来我想,由于查询不会提供密钥,我需要知道下一个项在哪里,然后才能提供它...
这进一步引导我阅读点对点协议以及它们如何跨节点处理同步问题。
所以我的问题是,你会如何解决上述描述的问题,或者这太牵强附会了,只是一个愚蠢的想法...?
简要概述、指针、不同的方法、各自的优缺点。可能适用的技术/概念/设计/理论。基本上任何有助于理解这样的东西如何工作的东西。
如果你想知道,不,我并不打算实现任何类似的东西,只是在阅读时突然想到的(这种情况经常发生,当我读一本好书时会被狂野的想法分心)。
更新
另一个有趣的问题是分布式删除。我知道像Cassandra这样的系统通过实现HintedHandoff、Read Repair和AntiEntropy来解决这个问题,而且似乎效果很好,但还有其他(可行且有效)的解决方法吗?