Содержание

суббота, 30 апреля 2011 г.

Как повысить отказоустойчивость вашей системы с помощью Java Service Wrapper

Если в вашем приложении падает OutOfMemoryError (OOM), то оно уже не может функционировать нормально, и все что вам остается - это перезапустить его. Данный процесс отлично автоматизируется с помощью Tanuki Java Service Wrapper. Так же данный сервис позволяет делать еще много разных штук, чтобы повысить отказоустойчивость (falt tolerance) вашей системы.


С помощью java wrapper вы можете запускать ваше java приложение в качестве сервиса, который будет стартовать при загрузке машины, а так же при любом падении вашего приложения. Таким образом он будет следить за тем, чтобы ваше приложение было постоянно запущено.

Так же java wrapper умеет перезапускать ваше приложение, если обнаружит в логах специальное сообщение. Например, с помощью следующей конфигурации можно заставить его перезапускать JVM при возникновении OutOfMemoryError.
Таким же способом вы можете скофигурировать перезагрузку вашего приложения при любой проблеме. Например, если ваше приложение не может восстановиться, когда случается какая-то критическая проблема, и поможет только перезапуск всей системы, то унаследуйтесть от jva.lang.Error, скажем, определите класс InfrustructureError и бросайте его в всех таких случаях, предварительно добавив соответствующую запись в конфигурационный файл. Только как и в случае OOM сделайте поиск по всей codebase, на отсутствие следующей конструкции:
которой часто грешат ленивые разработчики. Понятно, что при таком коде, вас никакой java wrapper не спасет.

Кстати в случае нехватки пaмяти JVM может и не бросать OOM (см. опцию -XX:-UseGCOverheadLimit), а начинать проводить все время в сборщике мусора. В это случае java wrapper тоже может помочь. По умолчанию он постоянно шлет пинги приложению, и если в течении полуминуты не получает ответа, то перезапускает JVM.
Еще java wrapper умеет печатать thread dump, если не может застопать JVM, но его надо попросить об этом:
И вообще он умеет еще много много чего.

А разве java wrapper не платный?

Да, кажется, теперь платный. Я сам очень удивился, когда увидел, что теперь за него деньги просят. Я его использовал 4 года назад и он был вполне себе бесплатный. Таким образом можно простоя взять старую версию, которая распространялась бесплатно и использовать её. Весь базовый функционал там есть. Найти все это добро можно на http://sourceforge.net/projects/wrapper. Если вам кажется, что это не совсем правильно или вам нужны самые последние фичи и поддержка, то возможно вам можно использовать бесплатную community edition. Я сам не пользовался, но вот тут человек пишет, что её надо еще сбилдить, и подробно описывает как это сделать. Если же у вас не open-source проект, то можно еще попробовать альтернативные похожие разработки, как например Yet Another Java Service Wrapper, которая является бесплатной.

В заключении хочу сказать, что не призываю вас писать кривой код и надеяться, что вас спасет jawa wrapper. Если у вас есть утечки памяти, то снимите heap dump, найдите причину и почините ваше приложение. Однако, это займет некоторое время, и пользователи вашего приложения не всегда будут ждать, пока вы там разберетесь в чем проблема и решите её. Так что подстелить соломку в виде java wrapper никогда не повредит.