Контекст: ОС: Linux (Ubuntu), язык: C (на самом деле Lua, но это не имеет значения).
Я бы предпочел решение на основе ZeroMQ,но приму что-нибудь достаточно вменяемое.
Примечание: по техническим причинам я не могу использовать здесь сигналы POSIX.
У меня есть несколько идентичных долгоживущих процессоводна машина («рабочие»).
Время от времени мне нужно доставлять управляющее сообщение каждому из процессов с помощью инструмента командной строки.Пример:
$ command-and-control worker-type run-collect-garbage
Каждый из рабочих на этом компьютере должен получить сообщение run-collect-garbage
. Примечание: было бы идеально, если бы решение как-то работало для всех работников на всех машинах в кластере, но я могу написать эту часть самостоятельно.
Это легко сделать, если я буду хранитьнемного информации о работающих работниках.Например, храните PID для них в известном месте и откройте управляющий сокет домена Unix по известному пути с PID где-нибудь в нем.Или откройте сокет TCP и сохраните хост и порт где-нибудь.
Но это потребует тщательного управления хранимой информацией - например, что, если рабочий процесс внезапно умрет?(Ничего неуправляемого, но все же лишняя суета.) Кроме того, информацию нужно где-то хранить, добавляя, таким образом, дополнительную сложность.
Есть ли хороший способ сделать это в стиле PUB / SUB?То есть работники - это подписчики, инструмент управления и контроля - это издатель, и все, что они знают, это, так сказать, единый «URL-адрес канала», по которому можно получать сообщения.
Дополнительнотребования:
- Сообщения на канал управления должны разбудить работников из цикла опроса (выбрать, что угодно).
- Доставка сообщенийдолжно быть гарантировано, и оно должно достигать каждого работающего, который слушает.
- Работник должен иметь возможность отслеживать сообщения без блокировки - в идеале с помощью цикла poll / select / любого упомянутого циклавыше.
- В идеале рабочий процесс должен быть в некотором смысле «сервером» - он не должен беспокоиться о сохранении постоянных соединений с «канальным сервером» (если таковые имеются) и т. д. - или об этомдолжно быть сделано прозрачно на основе.