Data structures 有效实施Birman-Schiper-Stephenson(BSS)协议';s延迟队列

Data structures 有效实施Birman-Schiper-Stephenson(BSS)协议';s延迟队列,data-structures,queue,distributed-computing,Data Structures,Queue,Distributed Computing,我使用的是分布式系统的协议,当前的假设是任何节点的对等集都不会改变。按照协议的规定,发送到节点的非因果顺序的消息必须放入“延迟队列”。我的问题是延迟队列的组织,我们必须对消息实现某种顺序。在决定顺序后,我们必须制定一个“唤醒”协议,该协议将在修改当前时间戳后有效地搜索队列,以确定其中一条延迟消息是否可以“唤醒”并被接受 我在考虑根据向量时间戳与该节点的时间戳的差异点,将延迟消息分离到BIN中。但是垃圾箱的数量可能非常大,维护它们不会有效率 请为这样的队列提供一些设计建议。很抱歉耽搁了您的时间——

我使用的是分布式系统的协议,当前的假设是任何节点的对等集都不会改变。按照协议的规定,发送到节点的非因果顺序的消息必须放入“延迟队列”。我的问题是延迟队列的组织,我们必须对消息实现某种顺序。在决定顺序后,我们必须制定一个“唤醒”协议,该协议将在修改当前时间戳后有效地搜索队列,以确定其中一条延迟消息是否可以“唤醒”并被接受

我在考虑根据向量时间戳与该节点的时间戳的差异点,将延迟消息分离到BIN中。但是垃圾箱的数量可能非常大,维护它们不会有效率

请为这样的队列提供一些设计建议。

很抱歉耽搁了您的时间——直到现在才看到您的问题。无论如何,如果你看看Isis2.codeplex.com,你会发现在Isis2中,我有一个casualsend实现,它使用了我们在BSS论文中描述的相同的向量时间戳方案。我所做的是将我的消息保持在部分顺序,按VT排序,然后当传递发生时,我可以查看延迟的队列并传递队列的前端,直到我找到无法传递的内容。它背后的一切也将无法交付

但事实上,这里有一个更深层次的见解:实际上,您永远不希望延迟消息队列变得很长。如果队列长度超过几条消息(例如,50或100),您就会遇到这样的问题:队列中的人可能持有相当多字节的数据,可能会开始分页或以其他方式运行缓慢。因此,它变成了一个自我永存的循环,在这个循环中,由于他有一个队列,他很可能会丢弃消息,从而越来越多地排队。另外,在他看来,无论如何,当务之急是恢复导致其他人混乱的丢失的信息

这意味着您需要一个流控制方案,在该方案中,挂起的异步内容的数量保持较小。但是,一旦您知道队列很小,搜索每个元素的成本就不会很高了!因此,从更深层的角度来看,无论发生什么情况,都需要流控制,而且由于流控制(如果您有一个有效的流控制方案),队列很小,而且由于队列很小,搜索成本不会很高