Понимание эликсира - PullRequest
       29

Понимание эликсира

0 голосов
/ 30 декабря 2018

Могут ли фреймворки Java, такие как SpringBoot и Play, обрабатывать несколько запросов одновременно, используя все ядра компьютера?Если они могут это сделать, то какую уникальную проблему решает Эликсир в отношении параллелизма?Это просто другой язык?Или есть какая-то разница в самой компьютерной парадигме, которая позволяет нам снизить затраты на сервер с помощью Elixir?

Вот отчет: https://www.techworld.com/apps-wearables/how-elixir-helped-bleacher-report-handle-8x-more-traffic-3653957/

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Существует три основных различия:

Облегченные процессы

Процессы Elixir не следует путать с процессами операционной системы.Процессы в Elixir чрезвычайно легки с точки зрения памяти и процессора (даже по сравнению с потоками, которые используются во многих других языках программирования).Из-за этого весьма обычно иметь десятки или даже сотни тысяч процессов, работающих одновременно.- https://elixir -lang.org / Getting-Start / Процесс.html

Отказоустойчивость

Erlang и, следовательно, Elixir использует концепцию дерева контроля , гарантируя, что сбой одного процесса не принесет вреда всему приложению;Более того, философия Эрланга однозначно гласит: «Пусть рухнет».По сути, это означает, что вам не нужно заботиться об обработке ошибок до некоторой степени.

У контроллеров есть встроенный механизм, ограничивающий количество перезапусков, которые могут произойти за определенный промежуток времени.Это определяется значениями двух параметров MaxR и MaxT.Если в течение последних секунд MaxT произойдет больше чем MaxR перезапусков, то супервизор отключает всех дочерних элементов, которые он контролирует, и умирает.- http://erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html

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

Вместо обмена данными процессы Erlang полностью изолированы , и единственным механизмом обмена между ними является передача сообщений;это делает управление памятью чрезвычайно эффективным и производительным.

Каждый процесс имеет свою собственную очередь ввода для сообщений, которые он получает.Новые полученные сообщения помещаются в конец очереди.Когда процесс выполняет прием, первое сообщение в очереди сопоставляется с первым шаблоном в приеме.Если это совпадает, сообщение удаляется из очереди и выполняются действия, соответствующие шаблону.- http://erlang.org/doc/getting_started/conc_prog.html#message-passing

0 голосов
/ 11 января 2019

Я постараюсь дать краткий ответ: Erlang / Elixir заставляет писать асинхронный неблокирующий код с использованием действующих лиц.

Вы можете видеть актеров как «микро» -микроуслуги.Актеры имеют свое собственное состояние, они не обмениваются данными (фактически все переменные являются неизменяемыми) и поэтому должны передавать асинхронные сообщения друг другу.

Erlang / Elixir имеет собственную виртуальную машину, которая может обрабатывать сотни тысяч потоков и других оптимизаций (потоки - это не потоки операционной системы, а виртуальные / легкие и виртуальная машина избегают копирования данных в память, даже если всепеременные являются неизменяемыми, копируя данные только тогда, когда это действительно необходимо)

Я не в курсе других систем Actor, поэтому я не могу сказать, может ли, например, Akka на JVM получить аналогичную производительность.Виртуальные системы акторов также могут справиться с большой работой, Орлеан - такая структура.(виртуальную систему акторов можно сравнить с внедрением зависимостей для актеров, когда они вам нужны, они создаются, а когда они не используются, они удаляются из памяти) https://github.com/dotnet/orleans

0 голосов
/ 31 декабря 2018

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

Эрланг и Эликсир имеют параллелизм, основанный на «Модель актера» .Актер получает сообщения и из этих сообщений может создавать новые сообщения, определять, как обрабатывать следующее сообщение, изменять свое собственное внутреннее состояние или создавать больше актеров.То, что сводится к тому, что каждый актер имеет свое собственное состояние, так что вам больше не нужно беспокоиться о блокировках или мьютексах.Это помогает облегчить умственную нагрузку при написании параллельного кода и, как абстракция, упрощает анализ параллелизма.В результате получается более эффективный параллельный код, который легче поддерживать.Модель актера может быть реализована на любом языке, но она встроена в Elixir и Erlang.

Кроме того, Elixir и Erlang являются функциональными языками.В функциональных языках побочные эффекты, задерживающиеся в состоянии от предыдущих вызовов методов, как правило, можно избежать.Это означает, что до тех пор, пока вы не нарушите функциональную чистоту, у вас есть возможность сказать, что метод будет возвращать одно и то же каждый раз.Что означает f (x) + f (x) == f (x) * 2.Это означает, что вы можете распараллеливать вещи в большей степени без страха.Запуск f (x) в одном потоке и g (x) в другом не может привести к состоянию гонки, если они функционально чисты.Потому что ни один из них не влияет на состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...