如果您必须在涉及高可用性和灾难恢复时审核 Java 应用程序的最差做法,您可能会寻找硬编码的 IP 地址和绑定句柄的次优缓存。还应该考虑什么?
6 回答
缺少动作/状态记录。
Java 应用程序应该能够从崩溃时的位置恢复。
这意味着应该有一种机制能够记录已经完成的事情(以免在下一次运行时重新做所有事情)。
这也意味着这样的 Java 程序应该总是在相同的一组动作之后达到相同的状态。(做某事两次会导致相同的结果,已经做过的动作不应该再做,而只是跳过)
该记录可以采用多种形式(文件、数据库、存储库中的元数据等),但重点是:愿意尽快恢复的 Java 应用程序应该知道它已经完成了什么。
缺乏监控设施。迟早,所有应用程序都会失败。发生这种情况时,您会想在其他人之前了解它。
缺乏日志记录。如果您找不到杀死您的应用程序的原因,那么很难修复它。当您遇到具有难以重现的情况的非常间歇性故障时,这尤其令人讨厌。
由于已经提到了适当的监控,我想补充一下,制定一个应急计划。它可以很简单:如果发生这种情况,那么我们就这样做,如果发生其他事情,那么我们就这样做。然后,当问题发生时,您只需遵循(先前测试过的)计划,而不是让每个人都惊慌失措并迅速做出决定。
在我看来,您所问的问题有几个关键方面。我不认为它是特定于语言的,并且您以 java 应用程序为例,所以我希望您不介意我不专门谈论 Java。
故障转移/HA:这是您识别 SPoF(单点故障)的地方。示例包括您提到的硬编码地址,以及以不可复制方式(例如本地磁盘)存储数据的应用程序。其他项目可能是缓存 DNS 查找“太长”,没有重新建立断开的连接,查找特定的硬件信息(例如 MAC 地址、CPUID、加密狗、分区标签、MB 或驱动器序列号等)。我已经将所有这些问题视为导致 BCP/DR 正常工作的不必要变通办法的问题。
数据完整性:数据如何存储?它是否使用自定义格式/结构?如果是这样,是否有“转储和恢复”机制?该服务是否需要停止为客户端提供服务,或者是否会降低其服务以进行备份?它是否将数据异步写入设备,如果是这样,它多久“刷新”到磁盘(有时这取决于应用程序,其他则不是)?文件锁定、内存到持久存储时间框架和功能也是其中的一部分。
从本质上看是什么导致你不得不解决。然后看看它是如何发生的,您可能会开始开发两个重要的知识:用于改进 BCP/DR 的模式,以及如您所提到的导致问题的 AntiPatterns。在可行的情况下尽早将这些类型的问题注入开发过程将帮助您的开发人员推导出您正在寻找的模式和反模式。通常只是提出问题就可以避免问题。
最好的办法是安排一些停机时间并进行测试。这样做你会发现更多的问题。一旦你把所有的东西都记录在案,让其他人在没有你帮助的情况下完成它。;)