Подтвердить что ты не робот

Процессор почтовых ящиков в распределенных системах

В моей копии эксперта F # на странице 379 я заметил следующий комментарий:

Передача и обработка сообщений

Часто проводится различие между shared-memory concurrency и сообщение прохождение concurrency. Первый часто более эффективны на локальных машинах и рассматривается в разделе "Использование Shared-Memory Concurrency" позже в эта глава. Последнее масштабируется до систем, в которых нет общих памяти, например, распределенных систем, а также может использоваться для проблемы производительности, связанные с разделяемая память.

Мне интересно передавать сообщения concurrency между процессами без общей памяти. Все примеры в Expert F # и в Интернете, которые демонстрируют, как использовать MailboxProcessor, содержат некоторые изменения этого кода:

let counter =
    MailboxProcessor.Start(fun inbox ->
        let rec loop n =
            async {
                do printfn "n = %d, waiting... " n
                let! msg = inbox.Receive()
                match msg with
                    | -1 ->
                        do printfn "'Til the bitter end..."
                        return ()
                    | n -> return! loop(n + msg)
            }
        loop 0)

counter.Post(20)
counter.Post(50)
counter.Post(-1) // kill mailbox

Другими словами, вы должны иметь дескриптор вашего почтового сервера в общей памяти, прежде чем отправлять сообщения на его канал. Это не стиль Erlang concurrency, насколько я знаю, поскольку вы можете отправлять сообщения только MailboxProcessors в одном и том же процессе (обратите внимание: процесс, а не поток).

Возможно ли, чтобы один MailboxProcessor в одном процессе отправил сообщения другому процессу MailboxProcessor? Если да, можете ли вы предоставить образец?

4b9b3361

Ответ 1

Я думаю, вы немного смутили терминологию. Процессы Erlang не обязательно соответствуют процессам ОС. Данный процесс ОС может иметь несколько процессов Erlang (и обычно это делает), так же как ваш процесс имеет несколько потоков. Если вы хотите установить связь между несколькими процессами ОС, вы можете проверить System.Runtime.Remoting.Channels.Ipc. По-видимому, оболочка MailboxProcessor может быть создана вокруг этих API.

Ответ 2

Процессор MailboxProcessor и AsyncReplyChannel не обеспечивают такую ​​же прозрачность местоположения, как операция "pid bang" (Pid!) в Erlang. Конечно, это работает только тогда, когда распределенные узлы Erlang настроены правильно, то есть имена, DNS, синхронизированные модули, файлы cookie и т.д. В OTP есть некоторые функции, облегчающие это администрирование. Конечно, если процессы Erlang находятся на одном и том же node, он просто работает. Но есть некоторые морщины с распределенным Эрланом.

"Сеть безопасна". Встроенные распределенные механизмы Erlang предполагают, что сеть защищена. Таким образом, при необходимости обеспечения безопасности используется метод связи на основе сокетов с прокси-процессами Erlang.

"Сеть надежна". Одной из вещей, которые делают распределенную работу Эрланга, является ее философия обработки ошибок, а именно, что процессы ненадежны, и, следовательно, отказоустойчивость достигается только путем передачи процессов мониторов процессов. OTP кодирует шаблоны (т.е. Супервизор) для реализации этой философии. Надежная передача сообщений в Erlang может быть достигнута через Mnesia (распределенная база данных), как это было сделано в RabbitMQ, но вы не получите ее из коробки.

В конце концов, распределенная связь никогда не бывает такой простой. Мы могли бы реализовать AsynchWorker в F #, чтобы действовать как наш прокси-сервер и общаться с ним через AsynchReplyChannel.Send. Нам еще нужно думать о ошибках распределенных вычислений.

Наконец, стиль передачи сообщений concurrency не подразумевает коммуникацию вне процесса. Это подразумевает отсутствие общего состояния для управления с помощью блокировок, таким образом, более простая и менее подверженная ошибкам модель параллельных вычислений. Я думаю, что это Prime Number Sieve - отличный пример этого стиля concurrency. Пример F # не так эстетичен, как реализация Squeak или Erlang из-за отсутствия встроенного синтаксиса для передачи сообщений, но он работает.

Ответ 3

Возможно, это будет

Уменьшить карту с помощью агентов F #

Я не получил много отзывов, поэтому не уверен, что он на 100% прав. Если вы думаете, что это плохо, сообщите об этом.

Спасибо!