1

我们有一个邮件发件人应用程序,它在一个 blob 中接收一堆邮件,然后将所有这些邮件放入数据库。这可能需要十分钟。在此过程中,邮件的状态为BUILDING

完成后,状态变为READY

当服务器崩溃(当然不应该发生)并重新启动时,它会查找所有带有状态的邮件BUILDING并将它们标记为ERROR. 发生这种情况是因为我们不想发送不完整的邮件。


现在我们想使用第二台服务器进行扩展。上面的恢复策略在这里不起作用。

例如,服务器 1 是BUILDING邮件,服务器 2 崩溃并重新启动。现在服务器 2 将看到BUILDING邮件并且不知道它是否已被中止或它是否正在另一台服务器上运行。


那么分布式服务的最佳恢复策略是什么?

(我们考虑了一些超时机制,BUILDING服务器每隔几秒更新一次时间戳,当某些服务器重新启动时,它会检查是否有BUILDINGx 分钟未更新的邮件。那么很有可能该邮件已被中止。 )


编辑:

我想要实现的目标:如果某个服务器重新启动(在崩溃之后或仅仅因为我们向集群添加了一个新的邮件服务器),它不应该邮件标记为ERROR好像这个特定的邮件实际上正在构建(由另一台服务器)。

很高兴:如果这无需存储服务器 ID 就可以工作,因为这样就可以轻松添加和/或删除服务器。否则,将无法完全删除某些服务器,因为那时可能会有BUILDING带有该特定服务器 ID 的邮件。但是该服务器已被删除,并且永远不会重新启动。尽管唯一可以将邮件设置为的服务器ERROR将消失。

4

1 回答 1

1

在您的状态跟踪中添加两件事:时间戳和处理它的服务器。

如果服务器启动并看到它自己处于构建状态的任何东西,它就知道它失败了。相反,如果它启动并看到另一台服务器处于构建状态的某些东西,它现在拥有稍后需要查看的信息,以确定是否存在需要解决的问题。您需要担心多个服务器同时重新启动,因此您不能让服务器在启动时获取所有服务器的所有旧捆绑包。

或者,您可以只为您的操作系统使用集群服务。

于 2015-04-11T14:12:33.273 回答