没有我能想到的“正确”方式。它取决于以下内容:
- 对时间窗口变化的敏感性。
- 您的应用程序需要以多快的速度恢复。
- 如果错过事件的影响。
- 如果它正在监视的事件没有达到第二个影响。
- 应用程序如何将事件反馈给外部世界。
启用故障转移的一些想法:
- 从一张白纸开始。在花时间开发其他任何东西之前,先检查一下这种情况最严重的影响。
- 从数据库加载事实列表(可能是今天的交易)。可能会按顺序重播。可能在使用伪时钟时。我知道这被用于金融部门的一些定价应用程序,但同时,我也知道由于需要的事件数量,其中一些系统可能需要很长时间才能赶上要重播。
- 定期保持有状态会话。根据允许落后 DR 应用程序多远以及持续会话需要多长时间来确定间隔。这样,DR 应用程序可以从数据库中检索相同的会话。但是,根据持久化之间的间隔,接收到的事件将存在差距。当然,如果失败的原因是会话损坏,那么这不会很好。
- 配置中间件以将事件转发到 2 个队列,并将主应用程序和 DR 应用程序订阅到这些队列。这样,两个监视器应该同步并且能够根据最后 1 分钟的活动做出决定。请注意,如果一条腿被占用了一段时间,那么它需要赶上,并且您的中间件需要容量来存储队列中的多个小时(无论中断可能有多长)的事件。此外,您的规则需要在排队时处理事件本身的时间戳,而不是当前时间。否则,在中断后恢复工作时,它很可能会根据时间窗口中的事件发出警报。
重播事件时要考虑的另一点是,在完成重播之前,您可能不希望向外界发出任何警报。例如,您可能不希望发送 50 封警报电子邮件来说明 ApplicationX 已关闭、向上、向下、向上、向下、向上……
我假设监控应用程序可能会以某种形式向外界推送警报。如果您有如 4 中的 hot-hot 配置,您还需要控制警报。我很想通过配置每个将警报推送到自己的队列来处理这个问题。然后中间件可以将来自辅助监视器的警报转发到死信队列。故障转移将重新配置中间件,以便主要警报进入死信队列,而次要警报进入警报通道。此机制还可用于丢弃重放恢复期间引发的事件。
考虑到重放事件可能产生的复杂性和潜在的混乱,对于监控应用程序,我可能更喜欢从头开始,或者使用持久会话。但是,这很可能取决于您正在监视的内容。