Как написать демон Java, работающий 24/7 ...
Мы запускаем на наших серверах Linux ряд приложений 24/365, которые просто вызывают Java, как показано ниже - не нужно никаких оболочек C:
nohup java -D... -X... -jar something.jar ... < /dev/null > output.log 2>&1 &
Это позволит запустить банку в фоновом режиме (nohup ... &
) без ввода (< /dev/null
), а вывод (stdout и stderr) будет перенаправлен в файл журнала (> output.log 2>&1
). У нас есть распределенная инфраструктура журналирования, но некоторый вывод консоли (такой как дамп потока) все еще ожидается. Эти приложения могут работать месяцами, пока мы не обновим их.
Можно ли настроить nagios для наблюдения за тем, работает ли мой демон, и для предупреждения меня или системного администратора, если это не так?
С точки зрения мониторинга вы многое можете сделать. Nagios, похоже, имеет плагин JMX для проверки информации, отображаемой jconsole
. Существует также множество собственных утилит для ведения журналов и мониторинга JMX. У нас есть внутренние зеленые / желтые / красные индикаторы, которые можно проверить с помощью JMX и легко проверить. Я также экспортировал простую службу JMX / HTTP из каждого приложения, чтобы предоставить информацию о состоянии, позволяющую сторонним инструментам мониторинга обнаруживать сбои.
Это будет клиентское приложение SMPP (или, я полагаю, ESME-приложение), поэтому я выбрал Java, так как он кажется очень зрелой платформой для SMPP.
Полагаю, вы имеете в виду SMPP ? Если так, то я не вижу причин, по которым Java не может сделать хорошую работу. Наши приложения выполняют широкий спектр протоколов HTTP, UDP, SMTP, JDBC, LDAP и других в режиме реального времени. Мы используем Jgroups на лот, что обеспечивает полный аутентифицированный, зашифрованный сетевой стек в Java.
Каков наилучший способ управления развертыванием новых сборок? Просто остановите демон и замените двоичный файл как можно быстрее и перезапустите?
Что касается замены работающего бинарного файла на лету, то это сложнее. У нас есть VIP и мы заменяем двоичные файлы на досуге. Наши внутренние протоколы предназначены для аварийного переключения. Если у вас нет VIP, то одна вещь, которую следует учитывать, это упорядоченная передача. Вы загружаете новый jar, и он обращается к приложению, на котором запущен старый jar, когда он готов связываться с новым портом. Затем старое приложение связывается, а новое связывается сразу же после этого. Нечто подобное.
Надеюсь, это поможет.