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

Erlang родился в Швеции, в Ericsson, чтобы стать языком их телефонных станций и сетевых устройств. Он был открыт в 1998 году.

Важно помнить, что Erlang — это не язык общего назначения. У него есть особая ниша, где он работает чрезвычайно хорошо, но в этой нише он возвышается так высоко над всем остальным, что это почти пугает. Его ниша — многосерверные (мы называем их узлами) распределенные приложения и управление сетью с несколькими узлами.

Так чем же хорош Erlang, а для чего он не годится?

Хотя Erlang отлично подходит для своей ниши, давайте будем прагматичны.

Эрланг отлично подходит для…

  • …для систем мониторинга, которые контролируют и координируют тысячи виртуальных машин.
  • …для распределенных баз данных (RIAK и CouchDB — это истории успеха).
  • …для веб-панелей управления, которые отображают или отображают данные в виде диаграмм в режиме реального времени.
  • …для сервисно-ориентированных программных архитектур. (RabbitMQ — это история успеха.)
  • …для специализированных высокопроизводительных веб-служб, таких как рекламный сервер, или конечных точек API.
  • …для приложений, которые выигрывают от распределенной многоузловой архитектуры.
  • …для приложений мягкого реального времени (потоковое видео — мягкого реального времени, баллистические ракеты — жесткого реального времени).
  • …для состояния бинарных взаимодействий, таких как поддерживающий протокол балансировщик нагрузки.
  • …для других долгосрочных демонов и служб. (В отличие от веб-страниц или сценариев, основанных на запросе и ответе.)

Но не очень хорошо для…

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

Обратите внимание: когда я говорю, что это «не очень хорошо», это не означает, что это невозможно сделать с помощью Erlang, просто это неэффективно. Это означает, что некоторые другие технологии, такие как PHP, JavaScript или даже Java или Perl, просто лучше подходят для этих задач.

(Это также сводится к пропорциям. Если ваша система на 98% очень хорошо подходит для Erlang, то какого черта, сделайте оставшиеся 2% тоже в Erlang. Но также и наоборот.)

Кроме того, не забывайте, что программисты на Erlang обычно очень хорошие программисты и, следовательно, обходятся дорого. Вы хотите использовать их для сложных задач, а не для тривиальности.

Примечание: объяснение массивного параллелизма

Представьте себе, что каждый раз, когда я отправляю кому-то электронное письмо, я замираю, пока он не пришлет мне ответ. Чтобы избежать этого, я мог бы использовать определенные трюки с большими накладными расходами (например, нанять секретаря, который будет заморожен вместо меня), но это было бы дорого. Именно так работает обычная объектная ориентация (C++, Java и все такое), но не в Erlang.

В Erlang параллелизм легкий и дешевый. Вы можете запустить сотни тысяч потоков, чего нельзя сделать с собственными потоками. (С собственными потоками ОС, хотя «теоретического» предела нет, вы теряете производительность, когда запускаете больше ядер процессора, чем число ядер вашего процессора, и код будет замедляться примерно до ~1000, если стеки не использовал бы всю вашу оперативную память намного раньше.)

В Erlang каждый объект в вашей системе может иметь свой собственный поток. Это означает, что объекты больше не являются просто салонными трюками, вроде бы пичкающими друг друга сообщениями, а на самом деле в основном ожидающими друг друга — здесь они на самом деле просто отправляют сообщения, а затем отправляются на другие вещи. Все как в реальном мире.

Так чем же так хорош Erlang?

Как архитектор программного обеспечения, эти функции делают Erlang очень ценным для меня:

  • Это массивная параллельность и распределенность. Мало того, что очень легко написать код, который использует несколько ядер процессора, так же легко написать код, который может охватывать несколько серверов. Не уверены, какие функции вашего программного обеспечения больше всего понравятся пользователям? Нет проблем, когда вы об этом узнаете, вы сможете позже перенести эти части на большие, лучшие и другие серверы!
  • Вы можете заглянуть под капот работающей системы. Наблюдаемость во время выполнения. Erlang — это больше, чем язык, на самом деле это небольшая операционная система, и даже когда ваш код работает, вы можете использовать оболочку (даже удаленно), отладчики времени выполнения, профилировщики и инструменты, подобные DTrace посмотреть, как ваш код делает свое дело. (Серьезно, так все и должно работать. Однажды испытав это, вы упускаете это из всего остального.)
  • Вы можете обновлять код в работающей системе, не останавливая ее. Горячая замена кода. Хотя вы не будете использовать его так часто, как изначально думаете, при правильном планировании это ключ к минимизации времени простоя. О, и узлы могут отправлять скомпилированный код друг другу с помощью одной команды, насколько это круто (и полезно)?
  • Ваши инвестиции защищены от «гниения». Erlang заботится об обратной совместимости. Я уже достаточно взрослый, чтобы знать, что мало что может быть более расточительным, чем необходимость переписывать пятую часть работающего приложения каждый год только для того, чтобы не отставать от языка/фреймворка/и т. д., чтобы не полагаться в конечном итоге на устаревшая и неподдерживаемая версия.
  • Очень чистая (хотя и необычная) модель обработки ошибок. Каждый узел Erlang похож на маленькую Звезду Смерти с Дартом Вейдером (надзиратели) и солдатами (рабочие процессы). Когда солдат ошибается? БЛАМ, его хозяин выстреливает ему в голову и тут же заменяет его клоном. Нет, друг мой, ваша ошибка не будет распространяться, вы не повлияете на Священное Глобальное Состояние Системы.
  • Средство создания отчетов/регистрации. Оно не получило должного внимания, но средство ведения журнала SASL (Библиотека поддержки системных приложений) и Браузер отчетов (rb) позволяют выполнять отладку постфактум. и повседневные операции стали намного более плавными. Это циклический журнал, поэтому вы можете заранее рассчитать, сколько максимального пространства он займет, что полезно для встраиваемых систем.
  • Глобальное разрешение имен. Это одна из вещей, которая вам понадобится, когда вы начнете писать распределенные программы. С Erlang у вас уже все готово.
  • База данных Mnesia. Внутренне чувствуется, что назвать базу данных «mnesia» — маркетинговая катастрофа, но это свидетельство превосходства технологии перед лицом маркетинга. Это распределенная база данных «noSQL», встроенная прямо в Erlang, которая поддерживает индексирование, репликацию, транзакции и отказоустойчивость. (И не забывайте о его более простых, но столь же полезных собратьях: быстрой ETS в памяти и постоянной базе данных DETS на диске.)
  • Автоматическая миграция приложений. С помощью простой настройки Erlang может автоматически перемещать ваши приложения от узла к узлу внутри кластера, например, в случае сбоя.
  • Много мелочей, над которыми вам не нужно беспокоиться. Знаете ли вы, что когда вы связываете два узла Erlang вместе, а их часы не синхронизированы, они начинают «искажать время» до синхронизировать часы медленно? Эта постепенность необходима, чтобы запланированные задачи не «пропускались». И есть много этих маленьких, но важных функций, о которых вы даже не думали, но они уже решены там для вас.

Каково это?

Вы знаете Вселенную Звездных врат, где экспедиция случайно попадает на инопланетный космический корабль? И затем им нужно перепроектировать работу инопланетного компьютера, чтобы иметь возможность управлять кораблем?

Что ж, Erlang чувствует себя довольно близко к этому. :)

Дополнительные ресурсы

Если вы программист и хотите быстро разобраться в этом, отправляйтесь на tryerlang.org, чтобы попробовать Erlang. Если вам нужен хороший и приятный учебник, Изучите Эрланг во благо — ваш лучший выбор. Лучший справочник по библиотеке — erldocs.com. Официальный сайт — erlang.org.

Бесстыдный плагин: я внештатный архитектор программного обеспечения (резюме), взгляните на мои услуги!

Первоначально опубликовано на https://kkovacs.eu.