erlang - как ограничить очередь сообщений или эмулировать ее? - PullRequest
4 голосов
/ 23 января 2010

Прямо сейчас я делаю процесс! Сообщение, но, как я немного погуглил, размер очереди сообщений ограничен только памятью. У меня есть дерево процессов, где листья генерируют сообщения и передаются в корень, и мне нужно ограничить очередь или переключиться на какой-то другой способ сделать то же самое.

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

Ответы [ 3 ]

8 голосов
/ 23 января 2010

Нет встроенных механизмов для ограничения размера очереди сообщений для процесса.

Обычным решением этой проблемы в эрланге является введение протокола управления потоком между производителем и потребителем. Это может быть так же просто, как отправитель, ожидающий ответа continue перед отправкой следующего сообщения. Вы можете изобрести более сложные протоколы управления потоками (оконные, ...), но часто подойдут send / wait-reply. Протокол gen_server:call/2 является хорошим протоколом запроса-ответа и его можно использовать повторно, посмотрев на код для gen_server и gen:call - он позаботится о многих возможных случаях.

Другой подход состоит в том, чтобы передавать сообщения через систему, а не отправлять их - в этом случае получатель запрашивает у отправителя сообщение, когда оно готово. Хотя если у вас есть внешние производители, которым вы не можете ограничить скорость или достаточно буферизировать, у вас может не быть этой опции.

2 голосов
/ 13 ноября 2013

RabbitMQ реализует это в форме кредитного потока. Больше информации на эту запись в блоге: http://videlalvaro.github.io/2013/09/rabbitmq-internals-credit-flow-for-erlang-processes.html

1 голос
/ 26 января 2010

Классический способ обработки вашего второго случая - включить в сообщение Pid процесса отправки. Это очень распространено для сообщений erlang, которые обычно имеют структуру, подобную {SendingPid,Data}. Это позволяет получателю обрабатывать как информацию о том, кто отправил сообщение, так и с помощью сопоставления с шаблоном в receive, чтобы выбрать, какой процесс он хочет получать сообщения.

Именно так erlang может мультиплексировать сообщения от разных отправителей в одной очереди сообщений и не заставлять обрабатывать все возможные сообщения везде.

...