Какие методы доступны в Unix для pub sub IPC?

Существуют различные варианты IPC.

По сети:

  • для клиент-сервера можно использовать TCP
  • для pub sub можно использовать многоадресную рассылку UDP

Локально:

  • для клиент-сервера можно использовать доменные сокеты unix
  • для паба можно использовать ???

Я полагаю, что мне был бы интересен какой-то файловый дескриптор, который одновременно поддерживает множество читателей (подписчиков) и многих авторов (издателей). Возможен ли/эффективен ли этот шаблон использования в Unix?


person grasevski    schedule 14.09.2014    source источник
comment
Прочтите Продвинутое программирование в Linux и опрос(2), socket(7) и tcp(7) и udp(7). Обратите внимание на D-bus.   -  person Basile Starynkevitch    schedule 14.09.2014


Ответы (3)


После долгих поисков я не нашел много информации о многоадресной рассылке ipc, поэтому я решил написать программу pubsub, которая принимает в качестве аргументов адрес издателя и адрес подписчика, прослушивает и принимает соединения по этим двум адресам, а затем для каждой полезной нагрузки, полученной в соединении издателя, запишите ее в каждое из соединений подписчика. Меня не удивит, если это неэффективно или изобретает велосипед, но я не нашел лучшего решения.

person grasevski    schedule 14.09.2014

Искал решение похожей проблемы и нашел /dev/fanout. Fanout — это модуль ядра, который реплицирует свой ввод для всех процессов, читающих из него. Вы можете думать об этом как о механизме широковещательной передачи IPC. По словам автора, хорошо работает для небольших полезных данных. Несколько процессов могут записывать на устройство, и несколько процессов могут читать с него. Однако я не уверен в атомарности записи. Небольшие записи из нескольких процессов должны происходить атомарно, как в случае FIFO и т. д.

Подробнее о разветвителе:

http://compgroups.net/comp.linux.development.system/-dev-fanout-a-one-to-many-multi/2869739 http://www.linuxtoys.org/fanout/fanout.html

person Praveen    schedule 06.09.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Peter Brittain; 07.09.2015
comment
Я отредактировал свой ответ, чтобы включить более подробную информацию об указанном решении. Спасибо за предложение. - person Praveen; 12.10.2015

Также существуют очереди сообщений Poix. Как говорит man mq_overview:

Очереди сообщений POSIX позволяют процессам обмениваться данными в форме сообщений. Этот API отличается от того, что предоставляется очередями сообщений System V (msgget(2), msgsnd(2), msgrcv(2) и т. д.), но предоставляет аналогичные функции.

Очереди сообщений создаются и открываются с помощью mq_open(3); эта функция возвращает дескриптор очереди сообщений (mqd_t), который используется для ссылки на открытую очередь сообщений в последующих вызовах. Каждая очередь сообщений идентифицируется именем вида /somename; то есть завершаемая нулем строка длиной до NAME_MAX (т. е. 255) символов, состоящая из начальной косой черты, за которой следует один или несколько символов, ни один из которых не является косой чертой. Два процесса могут работать с одной и той же очередью, передав одно и то же имя в mq_open(3).

Сообщения передаются в очередь и из очереди с помощью mq_send(3) и mq_receive(3). Когда процесс закончил использовать очередь, он закрывает ее с помощью mq_close(3), а когда очередь больше не нужна, ее можно удалить с помощью mq_unlink(3). Атрибуты очереди можно получить и (в некоторых случаях) изменить с помощью mq_getattr(3) и mq_setattr(3). Процесс может запросить асинхронное уведомление о поступлении сообщения в ранее пустую очередь с помощью mq_notify(3).

Дескриптор очереди сообщений является ссылкой на описание открытой очереди сообщений (см. open(2)). После fork(2) дочерний процесс наследует копии дескрипторов очереди сообщений своего родителя, и эти дескрипторы ссылаются на те же описания открытых очередей сообщений, что и соответствующие дескрипторы родительского объекта. Соответствующие дескрипторы в двух процессах совместно используют флаги (mq_flags), связанные с описанием открытой очереди сообщений.

Каждое сообщение имеет соответствующий приоритет, и сообщения всегда доставляются в процесс-получатель с наивысшим приоритетом первым. Приоритеты сообщений варьируются от 0 (низкий) до sysconf(_SC_MQ_PRIO_MAX) - 1 (высокий). В Linux sysconf(_SC_MQ_PRIO_MAX) возвращает 32768, но POSIX.1 требует только, чтобы реализация поддерживала как минимум приоритеты в диапазоне от 0 до 31; некоторые реализации предоставляют только этот диапазон.

Более дружественное введение Майкла Керриска доступно здесь: http://man7.org/conf/lca2013/IPC_Overview-LCA-2013-printable.pdf

person GDR    schedule 05.08.2018
comment
Просто примечание: OP запрашивал pub/sub, который, насколько мне известно, не поддерживается обычными очередями сообщений POSIX. - person Adam Johnston; 24.04.2020