На мой взгляд, есть пара ключевых аспектов того, о чем вы спрашиваете. Я не думаю, что это зависит от языка, и вы использовали Java-приложение в качестве примера, поэтому я надеюсь, что вы не против, чтобы я не говорил конкретно о Java.
Failover / HA :
Здесь вы указываете свой SPoF - единичные точки отказа. Примеры включают в себя жестко закодированные адреса, как вы упомянули, а также приложения, которые хранят данные в невоспроизводимых средствах, таких как локальный диск. Другими элементами могут быть кэширование DNS-запросов на «слишком длинный», не восстановление восстановленных соединений, поиск конкретной аппаратной информации (такой как MAC-адреса, CPUID, ключи, метки разделов, серийные номера MB или дисков и т. Д.). Я видел все это как проблемы, приводящие к ненужным обходным путям для обеспечения функциональности BCP / DR.
Целостность данных :
Как хранятся данные? Использует ли он собственный формат / структуру? Если так, то есть ли механизм «сброса и восстановления»? Службе нужно прекратить обслуживание клиентов или она ухудшает свою службу для резервного копирования? Записывает ли оно данные на устройство асинхронно, и если да, то как часто оно «сбрасывается» на диск (иногда это зависит от приложения, а другие - не так много)? Блокировка файлов, временные рамки и возможности памяти к постоянному хранилищу также являются частью этого.
По сути, посмотрите, что заставило бы вас обойти это. Затем посмотрите, как это произошло, и вы, вероятно, начнете разрабатывать два важных элемента знаний: шаблоны, используемые для улучшения BCP / DR, и, как вы упомянули, AntiPatterns, вызывающие проблемы. Внедрение этих типов вопросов в процесс разработки, как только это станет возможным, поможет вашим разработчикам получить шаблоны и анти-шаблоны, которые вы ищете. Часто просто задавать вопросы, чтобы избежать проблем.