4

LMAX Disruptor模式中,复制器用于将输入事件从主节点复制到从节点。所以设置可能如下所示:

在此处输入图像描述

主节点的复制器将事件写入数据库(尽管我们可以认为比写入数据库更好的机制——这对问题陈述不是很重要)。从节点的 Receiver 从 DB 中读取数据并将事件放到从节点的环形缓冲区中。

从节点的输出事件被忽略。

现在主节点的业务逻辑处理器有可能比从节点的业务逻辑处理器慢。例如,主节点的 BL 可能位于插槽 102,而从节点可能位于 106。(这可能是因为复制器在业务逻辑处理器之前从环形缓冲区读取事件)。

在这种情况下,如果主节点发生故障并且从节点现在成为主节点,则外部系统可能会错过一些关键事件。这可能是因为节点 2 在充当从节点时忽略了其输出。

Martin Fowler 确实指出复制器的工作是保持节点同步:“之前我提到 LMAX 在集群中运行其系统的多个副本以支持快速故障转移。复制器使这些节点保持同步”

但我不确定它如何保持业务逻辑处理器同步?有任何想法吗?

4

2 回答 2

8

复制是直接从主节点到从节点,而不是通过数据库。复制门从从站确认。

http://www.infoq.com/presentations/LMAX

上面的链接更详细,值得阅读关于演示文稿的评论讨论。

于 2013-07-17T11:39:33.580 回答
1

如果丢弃事件的成本很低,那么您可以忽略它(?)。

作为一个简单的实现,您可以让主节点上的输出中断器通知从节点它已完成发送数据包。把它想象成一个两阶段的复制器——一个复制事件,第二个复制器确认事件已经发送。

在现实世界的实现中,您可能需要在架构中提供额外的下游支持(尤其是重播/重试)。根据您的应用程序要求,您需要能够检测输出事件中是否存在间隙并在必要时获取它们。假设您的事件是幂等的,则应该没有问题可以及时返回并重播事件。

假设您的出站频道丢失了一个数据包,或者您的互联网线路出现故障?即使它成功地从干扰器中发出,它仍然可能丢失。这取决于您的特定应用程序,并且需要比这里更多的想法来确定您可以容忍的故障情况。

于 2013-07-17T11:42:47.677 回答