我们有一个邮件发件人应用程序,它在一个 blob 中接收一堆邮件,然后将所有这些邮件放入数据库。这可能需要十分钟。在此过程中,邮件的状态为BUILDING
。
完成后,状态变为READY
。
当服务器崩溃(当然不应该发生)并重新启动时,它会查找所有带有状态的邮件BUILDING
并将它们标记为ERROR
. 发生这种情况是因为我们不想发送不完整的邮件。
现在我们想使用第二台服务器进行扩展。上面的恢复策略在这里不起作用。
例如,服务器 1 是BUILDING
邮件,服务器 2 崩溃并重新启动。现在服务器 2 将看到BUILDING
邮件并且不知道它是否已被中止或它是否正在另一台服务器上运行。
那么分布式服务的最佳恢复策略是什么?
(我们考虑了一些超时机制,BUILDING
服务器每隔几秒更新一次时间戳,当某些服务器重新启动时,它会检查是否有BUILDING
x 分钟未更新的邮件。那么很有可能该邮件已被中止。 )
编辑:
我想要实现的目标:如果某个服务器重新启动(在崩溃之后或仅仅因为我们向集群添加了一个新的邮件服务器),它不应该将邮件标记为ERROR
好像这个特定的邮件实际上正在构建(由另一台服务器)。
很高兴:如果这无需存储服务器 ID 就可以工作,因为这样就可以轻松添加和/或删除服务器。否则,将无法完全删除某些服务器,因为那时可能会有BUILDING
带有该特定服务器 ID 的邮件。但是该服务器已被删除,并且永远不会重新启动。尽管唯一可以将邮件设置为的服务器ERROR
将消失。