Регистрация нескольких процессов в ZeroMQ Appender - PullRequest
0 голосов
/ 29 июня 2018

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

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

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

1 Ответ

0 голосов
/ 29 июня 2018

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

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

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

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

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

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

...