Распределенное ведение журнала на основе JMS. - PullRequest
2 голосов
/ 24 февраля 2011

В нашем необычном ESB ведение журнала каждого запроса осуществляется через общую инфраструктуру, основанную на ведении журнала на основе JMS. Вот что происходит в двух словах:

  1. служба получает запрос на обслуживание
  2. подготавливает некоторые данные в LogData
  3. база данных вызовов сервисов объектов
  4. время, необходимое для взаимодействия с БД, фиксируется в объекте LogData
  5. служба готова отправить ответ
  6. Объект LogData отправляется получателю сообщений
  7. служба отправляет ответ

Очень розовый! да для бумажных архитекторов. Вот актуальная проблема: Поставщик услуг JMS иногда становится недоступным - из-за ошибки на уровне системы или сбоя программного обеспечения. Затем служба ожидает на этапе (шаг № 6), где она должна установить соединение JMS для отправки объекта LogData. Это приводит к задержке ответа, что приводит к снижению производительности и восприятию пользователя.

Так что это самый большой недостаток «Распределенной регистрации с использованием JMS», рекламируемой многими веб-сайтами разработчиков. Также обратите внимание, что наличие LogData является своего рода критическим нефункциональным требованием. Это означает, что сообщения отправляются в постоянном режиме, что приводит к ожиданию, пока провайдер JMS не подтвердит получение сообщения отправителю (в данном случае это услуга) - в чем виноват? незрелый дизайн? Есть ли примеры успешной реализации чего-то подобного ?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Синхронное ведение журнала в db / jms / socket / etc требует больших проблем и многих из них.

Реализация с входом в память и асинхронностью.дамп в файл / jms (в зависимости от того, станет ли JMS доступным).Один фоновый поток должен помочь вам.Синхронизациярегистрация может вызвать много проблем в совершенно неожиданных и невинных частях приложения.

Я не могу вспомнить ни одной возможной истории успеха синхронизации.ведение журнала.

Правка.предпочтительно использовать подобное ConcurrentLinkedQueue для сохранения LogData (я имею в виду избегать любых блокировок, если возможно, чтобы улучшить производительность / пропускную способность)

2 голосов
/ 25 февраля 2011

Ну, главная проблема в вашем сценарии заключается в том, что у вашего брокера сообщений JMS (поставщика услуг) есть проблемы со стабильностью.Распределенная регистрация через JMS, безусловно, будет работать, если она рассматривается как критическая часть вашей инфраструктуры, которая не должна быть отключена, а должна контролироваться и работать в кластерной конфигурации, которая гарантирует, что хотя бы один экземпляр всегда работает.

Асинхронное ведение журнала не сильно поможет, если JMS-брокер не работает.например, если вы используете log4j AsyncAppender, он либо станет блокирующим приложением после заполнения буфера приложения, либо выбросит сообщения регистрации (если у вас блокировка = false).

Тем не менее, в моем опыте регистрацииЧерез JMS почти всегда было излишним, особенно если это единственная причина, по которой вы создали JMS-брокера.

Если вы хотите «распределить» ваши журналы по нескольким блокам, есть несколько простых способов сделать это:

  • запись в файл с переворотом каждый час или около того (с использованием прокруткифайл appender в log4j или backlog), а затем просто rsync каждый час в другие блоки
  • запись журналов в каталог NFS или в общий каталог SAN, смонтированный на всех боксах (каждый файл журнала должен использовать конкретное имя экземпляра дляизбегайте переопределения друг друга)
  • регистрируйте в БД непосредственно из приложения - возможно, вы захотите передать его через AsyncAppender, хотя, чтобы избежать блокировки.Надеемся, что ваша БД имеет более высокую доступность, чем JMS-провайдер

  • Ed Y.

...