分布式恢复 - 这可以在没有超时的情况下完成吗?

Distributed Recovery - can this be done without timeout?

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

完成后状态变为 READY

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


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

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


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

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


编辑:

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

很高兴: 如果这无需存储服务器 ID 就可以工作,因为这样就可以轻松添加 and/or 删除服务器。否则不可能完全删除某些服务器,因为那样可能会有一个 BUILDING 带有该特定服务器 ID 的邮件。但是这个服务器被删除了,再也不会启动了。虽然唯一可以将邮件设置为 ERROR 的服务器将会消失。

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

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

或者您可以只为 OS 使用集群服务。