Регистрация нескольких процессов в ZeroMQ Appender

У меня есть несколько процессов, запущенных на нескольких машинах, используя log4j (2.11). Мне нужно объединить сообщения регистрации для отображения на внешнем интерфейсе, и я хотел бы, чтобы каждый процесс использовал ZeroMQ Appender для публикации сообщений журнала в одном соединении. Затем у меня будет один подписчик, получающий сообщения, выполняющий консолидацию и затем отображающий сообщения журнала.

У меня есть игрушечное приложение, работающее с одним издателем (регистрация процесса); однако, когда несколько процессов пытаются подключиться к одной и той же конечной точке, я получаю сообщение об ошибке "Адрес уже используется". Что (скорее всего) означает, что приложение log4j ZeroMQ (JeroMQ) выполняет "привязку", поскольку только один процесс может связать сокет zmq.

Есть ли параметр конфигурации, чтобы приложение log4j ZeroMQ Appender выполняло "соединение" вместо "связывания", или есть другой вариант, доступный для достижения той же цели.

1 ответ

Есть две возможные причины отклонения "аппаратного обеспечения" .bind()-s

Один уже был в вашем посте - при условии, что JeroMQ-сервисы действительно пытаются жестко .bind() в местах, где вы хотели бы .connect() вместо. Просмотрите базу кода, чтобы либо подтвердить это (с помощью возможного форка / мода, обходящего любой такой дискомфорт с измененным способом обслуживания), либо отклоните эту альтернативу, если виноват не код.

Но позвольте мне упомянуть еще одну возможную причину, которая довольно часто была проблемой при PoC / прототипировании.

Инструменты макетов на ранних стадиях подвержены сбоям (и да, иногда они мирно рушатся, но иногда случаются сбои чаще или сложнее, чем команда PoC готова жить).

Если кодовая база (пока) не разработана должным образом на этом этапе, чтобы четко обрабатывать также управление ресурсами (правильное использование явного aSocket.setsockopt( LINGER, 0 ) (смертельная необходимость в нативных версиях API до 4.x) {aSocket|aMessage}.close() а также Context.term() методы), который выполняет чистый выход даже после сбоя, существуют ситуации, когда ваш код оставил все еще активным (не демонтированным) один или несколько Context()-экземпляры, которые (все еще) блокируют аппаратные ресурсы, так как им еще не было разрешено освобождать их.

Это иногда приводило к необходимости перезагрузки платформы, поскольку она заблокирована Context()- у экземпляра нет другого способа получить "пылесос" (позор тем, кто не сливает / не защищает код для выживания до финальной стадии try: except: finally: триада, чтобы обеспечить постепенное завершение и чистое освобождение всех выделенных ресурсов).

Другие вопросы по тегам