我一直在读算法入门,开始有一些想法和问题出现在我的脑海中。最让我困惑的是,如何设计一种算法来调度分布式队列中的项目/消息。
我的想法引导我浏览维基百科的主题,比如排序、消息队列、sheduling、分布式哈希表等等。
场景:
假设您希望有一个将消息(例如字符串或某个序列化对象)排队的系统。该系统的一个关键特性是避免任何单点故障。系统必须分布在某个集群内的多个节点上,并且必须一致地(或尽可能最好地)甚至是集群内每个节点的工作负载,以避免出现热点。
您希望避免使用主/从设计进行复制和扩展(没有单点故障)。系统完全避免了对磁盘的写入,并保持了内存中的数据结构。
由于这是某种类型的队列,因此系统应该能够使用不同的调度算法(fifo、最早截止时间、循环等)来确定在下一个请求时应返回哪个消息,而不管请求是向集群中的哪个节点发出的。
我最初的想法
我可以想象这在一台机器上是如何工作的,但是当我开始思考你将如何分发这样的问题时,比如:
如何散列每条消息?
我如何知道消息发送到哪个节点?
如何安排每个项目,以便确定下一步应返回哪个消息和哪个节点?
我开始阅读分布式哈希表,以及apache cassandra等项目如何使用某种一致的哈希来分发数据,但后来我想,因为查询不会提供密钥,所以我需要知道下一项在哪里,只需提供它……
这将导致阅读点对点协议以及它们如何处理跨节点的同步问题。
所以我的问题是,你会怎么处理像上面描述的问题,还是这太牵强了,只是一个愚蠢的想法…?
只是一个概述,指针,不同的方法,陷阱和每个好处。可能合适的技术/概念/设计/理论。基本上,任何有助于理解这类事情如何工作的东西。
如果你想知道,不,我不打算实现这样的东西,它只是突然出现在我的头脑中,而阅读(它发生了,我被疯狂的想法,当我读一本好书分心)。
更新
另一个有趣的问题是distributed deletes。我知道像cassandra这样的系统已经通过实现HintedHandoffRead RepairAntiEntropy来解决了这个问题,它似乎工作得很好,但是有没有其他(可行和有效的)方法来解决这个问题?

最佳答案

概述,如你所愿
有一些流行的分布式算法技术,例如使用时钟、波或通用路由算法。
你可以在伟大的分布式算法书籍Introduction to distributed algorithms by TelDistributed Algorithms by Lynch中找到这些。
减少
特别有用,因为一般的分布式算法会变得非常复杂。您可能可以使用一个更简单、更具体的案例。
例如,如果您希望避免单点故障,但对称分布式算法太复杂,则可以使用标准分布式算法(leader) election,然后使用更简单的非对称算法,即可以使用主机的算法。
类似地,您可以使用synchronizers将同步网络模型转换为异步网络模型。
您可以使用snapshots来离线分析,而不必处理各种在线进程状态。

08-07 01:44