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

  • Распространено
  • Отказоустойчивой
  • Мягкое в реальном времени
  • Горячая замена, высокодоступные, непрерывные приложения, в которых код может быть изменен без остановки системы (1)

Лучше для построения распределенных систем и распределенных вычислений (2)

Созданный с нуля с учетом параллелизма и распределенных вычислений, Erlang имеет прочные корни в телекоммуникационной отрасли, в которой параллельные процессы являются нормальным явлением. Он предназначен для одновременной работы, использования для распределенных вычислений и масштабируемости.
Он также отлично подходит для написания распределенных приложений. Erlang создан для параллельного и распределенного использования, поэтому очень легко писать код, использующий несколько процессорных ядер, а также очень легко писать приложения, охватывающие несколько серверов, по сравнению с тем, что вам нужно использовать библиотеку акторов в Scala для написания параллельных программ.

Лучшая отказоустойчивость

Отказоустойчивость означает, что система имеет свойство продолжать работать, даже если один или несколько компонентов вышли из строя. Для систем Erlang это означает, что система продолжает работать, даже если, например, пользователю нужно сбросить телефонный звонок, а не заставлять всех остальных делать это.
Erlang имеет лучшую отказоустойчивость, чем Scala, поскольку его виртуальная машина обеспечивает полную изоляция без совместного использования ресурсов между процессами (участниками) - вплоть до наличия отдельных куч и сборки мусора для каждого из них. Это то, чего Scala не может достичь, потому что он построен поверх JVM. (3)

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

  • Знание того, когда процесс остановился и почему это произошло
  • Способность заставить процессы умирать вместе, если они зависят друг от друга и если в одном из них есть ошибка
  • Регистратор, который регистрирует каждое неперехваченное исключение
  • Узлы, которые можно отслеживать, чтобы вы могли узнать, когда они выходят из строя
  • Возможность перезапуска неудачных процессов (или их групп)

Лучшая мягкая поддержка в реальном времени благодаря планированию акторов Erlang

И Erlang, и Scala используют модель акторов (в отличие от других параллельных моделей, основанных на потоках). В модели актора каждый объект является актером. Это объект, у которого есть почтовый ящик и поведение. Между участниками можно обмениваться сообщениями, которые сохраняются в почтовом ящике. После получения сообщения выполняется поведение актора, при котором он может: отправить ряд сообщений другим акторам, создать ряд акторов и принять новое поведение для следующего сообщения, которое будет получено.

Erlang использует вытесняющий планировщик для планирования процессов. Когда они выполняются в течение слишком длительного периода времени (обычно измеряется количеством вызванных методов или количеством используемых циклов ЦП) или когда они вводят оператор приема без доступных сообщений, процесс останавливается и помещается в очередь планирования. Это позволяет запускать большое количество процессов с определенной степенью справедливости. Длительные вычисления не приведут к тому, что другие процессы перестанут отвечать. Среда выполнения Erlang поддерживает симметричную многопроцессорность (SMP). Это означает, что она может планировать процессы параллельно на нескольких процессорах, что позволяет использовать преимущества многоядерных процессоров. Функциональная природа Erlang позволяет легко распараллеливать. Облегченный процесс (субъект) Erlang никогда не будет работать параллельно на нескольких процессорах, но использование многопоточной среды выполнения позволяет нескольким процессам работать одновременно. При использовании этого метода наблюдалось значительное увеличение производительности.

Scala делает различие между акторами, основанными на потоках, и акторами, основанными на событиях.
Акторы, основанные на потоках, - это акторы, каждый из которых запускается в своем собственном потоке JVM. Они планируются планировщиком потоков Java, который использует планировщик на основе вытесняющего приоритета. Когда субъект входит в блок приема, поток блокируется до тех пор, пока не появятся сообщения. Акторы на основе потоков позволяют выполнять длительные вычисления или блокировать операции ввода-вывода внутри акторов, не мешая выполнению других акторов. У этого метода есть важный недостаток: каждый поток можно рассматривать как тяжелый. и использует определенный объем памяти и накладывает некоторые накладные расходы на планирование. Когда запускается большое количество субъектов, виртуальной машине может не хватить памяти или она может работать неоптимально из-за больших накладных расходов на планирование.

В ситуациях, когда это неприемлемо, могут использоваться акторы, основанные на событиях. Акторы, основанные на событиях, представляют собой более легкую альтернативу, позволяющую использовать очень большое количество одновременно работающих акторов. Однако их не следует использовать для параллелизма: поскольку все акторы выполняются в одном потоке, справедливость планирования отсутствует. (4)

Горячая замена

Поскольку Erlang был разработан для обеспечения надежности, встроен код горячей замены (заменяющий код во время выполнения).
JVM имеет некоторую поддержку горячей замены кода. Классы можно изменять, но из-за системы статических типов нельзя изменять сигнатуры методов - только содержимое метода. В системе реального времени может оказаться невозможным остановить систему, чтобы выполнить обновление кода. В этих случаях Erlang предоставляет вам бесплатную поддержку динамического обновления кода при использовании OTP. Механизм очень прост для понимания и работает следующим образом:

  • Запустите приложение
  • Отредактируйте код
  • Перекомпилировать

Это все, что нужно: приложение обновляется новым кодом, пока оно еще выполняется, и тесты запускаются автоматически. (5)

Потому что Akka (библиотека акторов Scala) не может волшебным образом исправить модель общей памяти JVM: https://doc.akka.io/docs/akka/snapshot/. И потому, что JVM выполняет глобальную остановку сборки мусора, что делает мягкое в реальном времени неправдоподобным из-за непредсказуемости GC, влияющей на ваших актеров. В Erlang есть кучи для каждого процесса. По сути, виртуальная машина Erlang была создана для этого варианта использования, а JVM - нет, и это не то, что вы можете просто добавить с помощью библиотеки.

(1) Erlang (язык программирования) https://en.wikipedia.org/wiki/Erlang_(programming_language)
(2) https://www.slant.co/versus/116/11675/ ~ scala_vs_erlang
(3) https://www.scala-lang.org/old/node/1070.html
(4) Параллелизм в Erlang и Scala: модель акторов https: //rocketeer.be/articles/concurrency-in-erlang-scala/
(5) Многоядерные кризисы: Scala против Erlang https://www.infoq.com/news/2008/06/scala -vs-erlang

susan @ emq