MailboxProcessor и AsyncReplyChannel не обеспечивают такую же прозрачность расположения, как операция «pid bang» (Pid!) В Erlang. Конечно, это работает только тогда, когда распределенные узлы Erlang настроены правильно, то есть имена, DNS, синхронизированные модули, файлы cookie и т. Д. В OTP есть некоторые функции, которые упрощают администрирование. Конечно, если процессы Erlang находятся на одном узле, это просто работает. Но есть некоторые морщины с распределенным Erlang.
"Сеть защищена."
Встроенные распределенные механизмы Erlang предполагают, что сеть безопасна. Поэтому при необходимости обеспечения безопасности используется коммуникационный подход на основе сокетов с прокси-процессами Эрланга.
"Сеть надежна."
Одна из вещей, которая заставляет распределенный Erlang работать, - это его философия обработки ошибок, а именно то, что процессы ненадежны и, таким образом, отказоустойчивость достигается только посредством связи мониторов процессов. OTP кодифицирует шаблоны (т. Е. Supervisor) для реализации этой философии. Надежный обмен сообщениями в Erlang может быть достигнут с помощью Mnesia (распределенная база данных), как это было сделано в RabbitMQ, но вы не получаете его из коробки.
В конце концов, распределенные коммуникации никогда не были такими простыми. Мы могли бы реализовать AsynchWorker в F #, чтобы действовать в качестве нашего прокси и взаимодействовать с ним через AsynchReplyChannel.Send. Нам по-прежнему приходится думать об ошибках распределенных вычислений.
Наконец, параллелизм в стиле передачи сообщений не предполагает внепроцессного взаимодействия. Это подразумевает, что не существует общего состояния для управления с помощью блокировок, таким образом, более простая, менее подверженная ошибкам модель параллельных вычислений. Я думаю, что Сито с простыми числами является отличным примером этого стиля параллелизма. Пример F # не так эстетичен, как реализация Squeak или Erlang, из-за отсутствия встроенного синтаксиса для передачи сообщений, но он работает.