Способы реализации постоянных и изменяемых переменных Tomcat для всех серверов во всех веб-приложениях - PullRequest
0 голосов
/ 28 декабря 2018

Рабочая среда: Tomcat 9 в CentOS 7 x64, mysql / mariadb 5.5x

Среда тестирования: Tomcat 9 в Eclipse в Windows 7 x64, mysql 5.5x

Я TomcatНовичок ищет лучший способ иметь общесерверные переменные, доступные для чтения / записи из всех веб-приложений для таких вещей, как MaintenanceMode (вкл / выкл) и MaintenanceMessage и т. д. Вот свойства переменных, которые я ищу:

  • Доступно для чтения / записи из всех экземпляров всех Java-сервлетов во всех веб-приложениях.
  • Значение сохраняется после перезапуска ОС, Tomcat или Webapp.
  • Я должен иметь возможность изменить его значение содно веб-приложение, а затем все другие веб-приложения быстро распознают изменение, в идеале без перезапуска.
  • В идеале я не хотел бы читать переменную с диска при каждом запросе сервера.В случае, если сервер получает DDOSed или что-то в этом роде.
  • В идеале решение не зависит от ОС.
  • Если это решение с дисковым файлом, пожалуйста, порекомендуйте мне место для хранения файла.

Я новичок в Tomcat, поэтому некоторые детали в любых ответах приветствуются или ссылки на детали.Вероятно, я буду использовать сервлет в своем собственном веб-приложении «admin», доступном только через SSH-туннелирование и т. Д., Для установки переменных.Затем общедоступные веб-приложения будут реагировать на любые изменения, например, показывать сообщение о техобслуживании во время резервного копирования баз данных.Я мог бы также при необходимости изменить переменные с помощью команд linux.

Если бы я хранил переменные сервера в базе данных, это могло бы быть хорошо, но я бы не хотел читать БД по каждому отдельному запросу, скорее всего, икогда я изменяю переменную, мне придется еще раз уведомлять каждый веб-приложение / сервлет о том, что что-то изменилось, и перечитывать БД.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 28 декабря 2018

Я реализовал это недавно в форме «системных сообщений», некоторые из которых предназначены для обслуживания.Но эффект тот же.У нас были некоторые дополнительные «требования», которые помогли нам сформировать решение.Они могут или не могут соответствовать вашим ожиданиям / желаниям:

  1. Координация нескольких серверов
  2. Немедленная синхронизация не была необходима

Мы использовали нашу реляционнуюбаза данных для фактического хранения данных.Одна таблица с «системными сообщениями» и несколькими другими полями, например, когда сообщения вступили в силу (not_before DATETIME) и когда сообщения стали неэффективными (not_after DATETIME).

При запуске приложение считываеттаблица системных сообщений для поиска действительных на данный момент сообщений и сохранения их в области действия application, включая даты их действия.Всякий раз, когда мы хотим показать их на экране, мы проверяем каждый элемент в памяти и удаляем любой, срок действия которого истек.Это довольно быстро.

Каждые Х минут (например, с cron) мы делаем запрос к специальному сервлету (на каждом сервере), который перезагружает системные сообщения из базы данных.Мы защищаем этот сервлет, разрешая запросы только с определенных IP-адресов, поэтому DOS не является проблемой.

Мы можем не только добавить системное сообщение с любого сервера в кластере, но и добавить его, написав непосредственно вбаза данных.Это может быть полезно, если вы не всегда хотите использовать свое приложение для генерации этих событий.

Вы можете изменить значение X на любое меньшее, чем 1 (минута), если вы используете cron.Если вы используете какую-то другую систему, вы, вероятно, сможете получать обновления еще чаще.Я бы серьезно пересмотрел ваше требование «немедленного» распознавания, потому что для этого требуется система с гораздо худшей производительностью.

Если вы можете гарантировать, что только ваше приложение может генерировать эти изменения, и у вас есть список всех других серверовгде-то в кластере, вы можете теоретически пропинговать их все новым сообщением (или уведомить их, что новое сообщение существует, и пришло время обновить их список сообщений), но такие вещи лучше сделать с помощью инструмента оркестровки, такого какKubernetes, и мы выходим из зоны действия ИМО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...