Erlang
call інтуїтивно використовувати, коли потрібна відповідь. '''критично:''' NIF — це місце, де Erlang здатна втратити частину своєї fault tolerance.</div> <pre>
1> 2 + 3.== Priority messages == Process має PID — ідентифікатор процесу. Спроба присвоїти інше значення тій самій змінній не функціонує як у імперативних мовах. * '''Release''' — зібрана Erlang/OTP-система для deployment. rebar3 new app my_app У такому підході платформа складається з незалежних actors/processes. Pattern matching — центральна частина Erlang.
Property-based testing перевіряє не один приклад, а властивості програми на багатьох generated inputs. Link створює двосторонній зв’язок: якщо один process падає, сигнал отримує інший. sum(List, 0). Вона підтримує:
Arity — кількість аргументів функції. rebar3 eunit
Erlang найсильніший там, де потрібні concurrency, fault tolerance і long-running systems. # Думати про backpressure. Це платформа для побудови систем, які мають жити довго, опрацьовувати багато одночасних подій і відновлюватися після помилок.
└── Session Supervisor
'''Коротко:''' Erlang — це мова й платформа для систем, які мають не без зусиль “працювати”, а продовжувати працювати навіть тоді, коли окремі частини падають. Сценарії:
<pre>
{hello, Name} ->
* network partitions;
* security;
* node cookies;
* latency;
* cluster topology;
* observability;
* failure detection. '''Atom''' — іменоване константне значення. ├── HTTP Listener
<pre>
* уникати race conditions;
* спростити reasoning;
* зробити процеси ізольованими;
* краще працювати з message passing. Особливість
Processes можуть бути linked або monitored.== Lists ==
* gen_server;
* gen_statem;
* gen_event;
* supervisor;
* application. * Cowboy;
* Ranch;
* Elli;
* Webmachine historically;
* Zotonic;
* ChicagoBoss historically. # Використовувати Dialyzer і typespecs.<pre>
Erlang найкраще використовувати там, де головна вимога — не без зусиль виконати код, а побудувати систему, яка продовжує працювати під навантаженням, при помилках і в distributed environment. * [https://www.erlang.org/ Erlang/OTP — офіційна сторінка]
* [https://www.erlang.org/downloads Erlang/OTP Downloads]
* [https://www.erlang.org/downloads/28 Erlang/OTP 28 Downloads]
* [https://www.erlang.org/news/180 Erlang/OTP 28.0 Release]
* [https://www.erlang.org/blog/highlights-otp-28/ Erlang/OTP 28 Highlights]
* [https://www.erlang.org/doc/ Erlang/OTP Documentation]
* [https://www.erlang.org/doc/apps/stdlib/supervisor.html Erlang/OTP — supervisor behaviour]
* [https://www.erlang.org/doc/system/gen_server_concepts.html Erlang/OTP — gen_server Behaviour]
* [https://www.erlang.org/docs/18/man/gen_server Erlang/OTP — gen_server manual]
* [https://www.erlang.org/doc/system/sup_princ.html Erlang/OTP — Supervisor Principles]
* [https://www.erlang.org/doc/system/applications.html Erlang/OTP — Applications]
* [https://www.erlang.org/doc/system/release_structure.html Erlang/OTP — Release Structure]
* [https://www.erlang.org/doc/system/distributed.html Erlang/OTP — Distributed Erlang]
* [https://github.com/erlang/otp Erlang/OTP GitHub Repository]
* [https://github.com/erlang/otp/releases Erlang/OTP GitHub Releases]
* [https://rebar3.org/ Rebar3]
* [https://www.erlang.org/doc/apps/eunit/chapter.html Erlang/OTP — EUnit]
* [https://www.erlang.org/doc/apps/common_test/ Common Test]
* [https://proper-testing.github.io/ PropEr]
* [https://learnyousomeerlang.com/ Learn You Some Erlang]
* [https://www.mediawiki.org/wiki/Help:Formatting MediaWiki — Help:Formatting]
* [https://www.mediawiki.org/wiki/Help:Links MediaWiki — Help:Links]
Серед помітних новинок OTP 28 офіційний блог виділяє priority messages — opt-in механізм, який дає можливість процесу отримувати деякі urgent messages раніше за звичайні повідомлення в черзі. Hex.pm — package manager ecosystem для Erlang/Elixir. end). example:hello/0
Не можна випадково публікувати Erlang cookie в репозиторії або logs. # Використовувати gen_statem для state machines. Common Test — testing framework для більших test suites. Binaries важливі для: Release здатна включати:
SEO title: Erlang — мова для fault-tolerant систем, BEAM VM, OTP, actor model, процесів, message passing і distributed systems
SEO keywords: Erlang, Erlang/OTP, OTP 28, BEAM, BEAM VM, actor model, lightweight processes, message passing, supervisors, supervision tree, gen_server, gen_statem, gen_event, OTP behaviours, Erlang applications, Erlang releases, hot code upgrade, distributed Erlang, fault tolerance, let it crash, concurrency Erlang, telecom systems, RabbitMQ, Elixir, EUnit, Common Test, PropEr, Erlang backend, distributed systems, high availability, soft real-time systems
</noinclude>
{{SEO
Шаблон для службового SEO-опису сторінки.
}}
- документації;
- Dialyzer;
- API contracts;
- code navigation;
- maintenance. * Pattern matching — зіставлення значень із шаблонами.== Коли Erlang особливо корисний ==
Erlang і API
У Erlang foo/1 і foo/2 — різні функції. * ETS — in-memory storage для Erlang terms.
OTP містить:
Це означає, що він часто знаходить реальні проблеми, але не вимагає описувати всі типи наперед.
Erlang можна використовувати для backend-сервісів. * 24/7 availability;
- soft real-time;
- hot upgrade;
- fault isolation;
- distributed operation;
- call/session management;
- supervision;
- message passing.
Pid = spawn(fun() -> Let it crash В Erlang backpressure важливий, бо mailbox process здатна рости. '''Elixir''' — сучасна мова на BEAM VM.== Performance == '''Dialyzer''' — static analysis tool для Erlang. Це компонент системи. Ідея: можна оновити код без повної зупинки системи. |- | '''Erlang''' || оригінальна мова OTP, telecom roots, дуже стабільна |- | '''Elixir''' || сучасніший синтаксис, Mix tooling, Phoenix web framework, ширша популярність у web |} Для CPU-heavy задач Erlang здатна бути не найкращим вибором.
<pre> Сильні сторони: * one_for_one; * one_for_all; * rest_for_one; * simple_one_for_one historically / dynamic supervisors у новіших підходах.== Common Test == == DETS == == call і cast == Але Erlang дуже практичний: його функціональність служить не академічній красі, а побудові надійних систем. }). rebar3 release * EUnit для unit tests; * Common Test для integration/system tests; * PropEr для property-based tests; * Dialyzer для static analysis; * release tests; * distributed tests; * fault injection; * supervisor restart tests. Без backpressure можливі: == Node cookie == критично: atoms не збираються garbage collector у звичайному сенсі, тому не можна безконтрольно створювати atoms із зовнішнього input. * '''Hot code upgrade''' — оновлення версій коду без повної зупинки системи. Він корисний для: == Tuples == == Recursion == Pattern matching зі списком: Для high-concurrency I/O systems — часто дуже сильний.</div> Звичайно повідомлення додаються в кінець черги процесу. # Описувати message formats.
Це не означає “писати поганий код”. Станом на травень 2026 року офіційна сторінка Downloads вказує Erlang/OTP 28.5 як latest version of Erlang/OTP. BEAM так само виконує інші мови, зокрема Elixir.== Erlang shell ==
як приклад: Erlang processes — це не операційні системні процеси.
Ключова ідея: Erlang не намагається зробити один бізнес-процес дуже складним.== Erlang cookie security ==
io:format("Hello, ~s~n", [Name])
add(A, B) -> |- | Erlang || fault tolerance, concurrency, messaging, distributed systems, OTP |- | Go || простий backend, cloud-native, single binary, performance |- | Java || enterprise ecosystem, JVM, Spring, tooling |- | C# || .NET, ASP.NET Core, Microsoft ecosystem, enterprise |- | Python || scripting, data, AI, automation, швидкий старт |}
Erlang release — зібрана платформа для deployment.== Strings ==
ETS не виступає як заміною persistent database, але дуже корисний для runtime state. Behaviour — OTP-шаблон для типових процесів. * Atom — іменована константа. Замість цього застосовується для recursion.
Erlang практичніший для resilient runtime systems. * '''Tuple''' — фіксована структура значень.<pre> BEAM — одна з головних причин, чому Erlang добре підходить для high-concurrency systems. * '''Mailbox''' — черга повідомлень процесу.
- caches;
- lookup tables;
- shared read-heavy data;
- session data;
- counters;
- local state. Module має ім’я й список exported functions. # Не створювати atoms із user input. -spec add(integer(), integer()) -> integer(). # Тестувати crash/restart scenarios. У багатьох сучасних deployment-процесах замість hot upgrade використовують rolling deploy або blue-green deploy, але сама можливість залишається важливою частиною Erlang-історії. greeter:hello("Erlang"). У gen_server виступає як два типові способи взаємодії:
Tuple — фіксована структура. * Map — key-value структура. status_text(draft) -> "Чернетка"; Поширені помилки: |- | Erlang || fault-tolerant distributed runtime, processes, message passing, OTP |- | Haskell || чисті функції, сильна type system, lazy evaluation, математичне моделювання |}
Проста аналогія: Erlang-система схожа на добре організовану команду. # Обережно використовувати NIFs. erl
Джерела
2> self().== Maps ==
Приклад:
- isolated processes;
- supervisors;
- links;
- monitors;
- message passing;
- supervision trees;
- crash recovery;
- distribution;
- process-per-connection style;
- hot code loading. └── Session Worker 3
Erlang і Web
Пояснення термінів
Безпека
Backpressure
Потрібно думати про:
├── Session Worker 1
- supervisors;
- gen_server;
- gen_statem;
- applications;
- releases;
- logging;
- distributed tools;
- release handling;
- debugging tools;
- стандартні design patterns. Let it crash — філософія Erlang. Сильні сторони
Порівняння:
Variables
RabbitMQ використовує сильні сторони Erlang:
Acc;
Hex.pm
Актуальна реліз системи
- application callback module;
- supervision tree;
- config;
- dependencies;
- workers;
- release metadata. Кожен Erlang process має mailbox — чергу повідомлень. Значення не змінюються після створення. Фокус
RabbitMQ — популярний message broker, написаний на Erlang. * робота 24/7. -export([hello/0]). add(A) -> A + 1.== Erlang і WhatsApp ==
Він застосовується для для процесів, які мають state і обробляють requests/messages. rebar3 ct
Але для hard real-time embedded control Erlang зазвичай не виступає як першим вибором. OTP application — не обов’язково “додаток” у звичному UI-сенсі.
Behaviours
hello(Name) ->
Сценарії:
Типові помилки в Erlang
== Erlang і OTP == == supervisor == * крапки в кінці function definitions; * коми між expressions; * крапку з комою між clauses; * atoms; * pattern matching; * single assignment. Офіційна документація gen_server пояснює, що gen_server здатна створювати process як частину supervision tree через <code>start_link</code>, а process викликає <code>Module:init/1</code> для ініціалізації. # Захищати Erlang cookie. Typespecs корисні для: Він застосовується для для: Це дає можливість явно опрацьовувати успіх і помилку.
Відправка повідомлення: Maps корисні для structured data, configs, JSON-like structures і API payloads.[1]
sum(List) ->
Erlang syntax здатна здаватися незвичним через: Supervisor — бізнес-процес, який контролює child processes. Supervision tree — дерево supervisors і workers. Тому часто говорять не без зусиль Erlang, а Erlang/OTP. Observer — Erlang GUI tool для перегляду runtime-системи. # Додавати EUnit і Common Test. Приклади:
io:format("Hello, ~s~n", [Name]). ok
gen_statem — behaviour для state machines. Erlang — це не без зусиль функціональна мова. * Rebar3 — build tool для Erlang. {hello, "Erlang"}. * gen_server — generic server behaviour. WhatsApp історично часто згадується як приклад системи, яка використовувала Erlang для масштабної messaging infrastructure. Якщо pattern не збігається, буде error. * messaging backend;
- chat server;
- presence system;
- notification service;
- IoT gateway;
- protocol server;
- multiplayer coordination;
- distributed control plane;
- queue workers;
- real-time systems. У BEAM garbage collection зазвичай process-local. Мова !! BEAM — virtual machine, на якій виконується Erlang-код. Для production потрібні network isolation, firewall, secrets management і TLS, якщо доречно. Distributed Erlang дає можливість Erlang nodes спілкуватися між собою. Приклад:
Function arity
Практичний висновок
Application Supervisor
OTP — це набір libraries, behaviours, design principles і tooling для побудови production-систем на Erlang. * distributed Erlang applications;
- metadata;
- telecom-like systems;
- small/medium distributed state;
- systems tightly integrated with Erlang nodes. Якщо один працівник помилився, керівник не зупиняє всю компанію, а перезапускає саме цю ділянку роботи. Коли process отримує message, він здатна обробити його через
receive. Це називають single assignment. Він здатна показувати:
Але Erlang має менший ринок ERP в Україні розробників, ніж mainstream backend-мови. Типові стратегії:
Functional programming
Numbers = [1, 2, 3, 4]. * HTTP listener приймає request;
- process обробляє session;
- gen_server керує state;
- supervisor перезапускає workers;
- response повертається client. NIF — Native Implemented Function, код на C/C++, який викликається всередині BEAM.
Xне змінюється. Rebar3 — стандартний вибір для багатьох Erlang-проєктів.[2]
<pre>
Message passing оптимізує уникати shared mutable state. Erlang здатна бути невдалим вибором, якщо:
[[Категорія:Actor Model]]
* processes;
* applications;
* memory;
* scheduler info;
* ETS tables;
* supervision trees. * '''Arity''' — кількість аргументів функції. !== Erlang у бізнесі ==
{error, Reason}
{ok, Value} = {ok, 42}. Створюється нове значення <code>Y</code>. Для Erlang production-систем потрібні:
* <code>call</code> — синхронний request із відповіддю;
* <code>cast</code> — асинхронне повідомлення без очікування відповіді. {ok, Result}
Але hot upgrades складні:
== Ports і NIFs ==
<pre>
Shell корисний для:
paid
'''Mnesia''' — distributed database management system, що входить в OTP. Приклад:
├── Session Worker 2
Сьогодні Erlang застосовують, коли потрібно не тільки в telecom, а й у messaging systems, real-time backend, distributed systems, IoT, фінансових системах, chat-серверах, брокерах повідомлень і high-availability інфраструктурі. cancelled
* писати Erlang як імперативну мову;
* створювати processes без supervision;
* ігнорувати mailbox growth;
* використовувати gen_server для всього;
* ловити всі errors замість правильної supervision strategy;
* створювати atoms із зовнішнього input;
* використовувати NIF без розуміння ризиків;
* не контролювати distributed Erlang security;
* не тестувати restart scenarios;
* не використовувати Dialyzer;
* не документувати message formats;
* не думати про backpressure;
* запускати distributed nodes без network/security design. це функціональна мова програмування і runtime-платформа; так само реалізовано distributed і fault-tolerant систем виступає ключовою рисою побудови concurrent забезпечується через '''Erlang'''. * '''OTP''' — набір Erlang libraries, behaviours і design principles для production systems. Erlang добре підходить для soft real-time:
Erlang має потужний binary pattern matching:
Кожен process:
* BEAM VM;
* lightweight processes;
* message passing;
* actor model;
* OTP;
* supervisors;
* supervision trees;
* gen_server;
* gen_statem;
* fault tolerance;
* distributed Erlang;
* hot code loading;
* telecom heritage;
* soft real-time systems;
* RabbitMQ-like workloads.== Let it crash ==
</div>
Erlang/OTP 28 був випущений 21 травня 2025 року як новий major release з новими можливостями, покращеннями й деякими несумісностями. Erlang доречний тоді, коли його fault-tolerance модель справді потрібна. Під час роботи з Erlang варто:
* потрібен простий CRUD;
* команда не знає Erlang/OTP;
* потрібен великий ринок ERP в Україні розробників;
* потрібен CPU-heavy numerical code;
* потрібна AI/data science ecosystem;
* потрібен mobile app;
* потрібен modern mainstream web stack;
* fault tolerance не виступає як важливою вимогою;
* платформа швидко вирішується Go/C#/Java/Python;
* немає плану observability і OTP architecture. '''ETS''' — Erlang Term Storage. Змінні в Erlang присвоюються один раз.
Telecom systems потребували:
Immutability оптимізує:
Типові callbacks:
Це добре підходить для:
<pre>
Erlang особливо корисний для:
Використання:
Name = maps:get(name, User).== Хороші практики ==
EUnit корисний для маленьких unit tests. * '''Application''' — OTP application, логічна одиниця системи. io:format("Hello~n"). * protocols;
* connection lifecycle;
* payment workflow;
* device states;
* session management;
* telecom flows. Поведінка runtime, libraries і tooling здатна залежати від OTP-релізу.<ref>https://www.erlang.org/news/180</ref>
<pre>
Observability
Приклад:
status_text(paid) -> "Оплачено";
- підтримку;
- ліцензію;
- сумісність з OTP;
- активність;
- транзитивні залежності;
- security issues. Мова !! * Erlang — функціональна мова й runtime-платформа для concurrent і fault-tolerant systems.== Links і monitors ==
- Проектувати supervision tree з самого початку.
Замість того щоб боятися кожної помилки, Erlang пропонує підхід: Він не веде обліковий облік, не проводить документи й не керує складом сам по собі. '''Soft real-time''' означає, що платформа має реагувати оперативно й стабільно, але не гарантує жорстких real-time deadlines як hard real-time systems. Приклад:
- observer;
- recon;
- telemetry;
- OpenTelemetry;
- logs;
- custom metrics;
- VM statistics. '''EUnit''' — unit testing framework для Erlang. Cookie потрібно зберігати як секрет. Erlang здатна взаємодіяти з зовнішнім кодом через ports і NIFs. застосовується для для dependencies.== Дивіться так само ==
Y = X + 5.[[Категорія:Програмування]]
Цей підхід функціонує тільки тоді, коли правильно побудовані supervision trees, state boundaries і recovery strategy. Для багатьох сучасних web/backend систем частіше використовують PostgreSQL, Redis, Kafka, RabbitMQ або інші спеціалізовані сховища. {ok, 42}
- менший ринок ERP в Україні розробників;
- незвичний синтаксис;
- менша mainstream web ecosystem;
- не найкращий вибір для CPU-heavy задач;
- distributed systems усе одно складні;
- потрібна дисципліна OTP architecture;
- NIFs можуть зламати fault tolerance;
- observability і backpressure потрібно проектувати. Головна ідея Erlang — будувати системи з багатьох легких ізольованих процесів, які спілкуються повідомленнями. Common Test часто застосовується для в серйозних Erlang/OTP проєктах. Для довгих циклів важлива tail recursion. Ви описуєте, хто за ким стежить, що робити після падіння, як перезапускати частини системи й де проходять межі відмови. # Моніторити BEAM runtime metrics. * Erlang runtime;
- applications;
- configuration;
- boot scripts;
- release metadata;
- versioning;
- upgrade instructions.
== Dialyzer == Функції ідентифікуються як: Приклад ідеї: * message broker integration; * real-time notification service; * high-availability gateway; * concurrent session service; * IoT/telemetry ingestion; * distributed background processing; * fault-tolerant integration layer; * service, де важлива supervision і self-healing. Це критично для exports, callbacks і documentation. '''Port''' — безпечніший спосіб спілкування із зовнішньою програмою як окремим OS process. Тут: == Fault tolerance == На performance впливають: Приклад сценарію: Офіційна документація supervisor behavior описує supervisor як process, що supervises child processes; child process здатна бути іншим supervisor або worker process, зазвичай реалізованим через gen_server, gen_statem або gen_event.<pre> * потрібно думати про state migration; * old і new code можуть співіснувати; * callbacks code_change/3 мають бути правильними; * release handling має бути протестований. Але основну бізнес-логіку ERP зазвичай варто писати в основному стеку системи. Tail recursion — recursion, де recursive call виступає як останньою операцією функції. Але для сучасної роботи з текстом і network data часто використовують binaries: sum(T, Acc + H). Erlang часто описують через '''actor model'''.== Restart strategies ==
List — базова структура даних. {customer, 10, "Anna"}
Цей приклад важливий не як “магічна реклама Erlang”, а як демонстрація того, що Erlang добре підходить для великої кількості одночасних з’єднань і messaging. * Mnesia — distributed database в OTP.== Rebar3 ==
add(A, B) -> A + B. * Supervision tree — дерево supervisors і workers. Для production persistence потрібно обережно оцінювати, чи DETS справді підходить.== Erlang і distributed systems ==
Actor model
Pattern matching
- кількість processes;
- mailbox sizes;
- message copying;
- binary handling;
- scheduler utilization;
- garbage collection;
- ETS usage;
- NIFs;
- distribution overhead;
- serialization;
- supervision restarts.== Hot code upgrade ==
Але fault tolerance не виникає автоматизовано.
end. Приклад: Це основа для supervisor-like behaviour і fault detection. * BEAM — virtual machine для Erlang і Elixir. Приклад модуля:
Headбуде1;Tailбуде[2,3]. * Message passing — передача повідомлень між processes.== Message passing ==
- init/1;
- handle_call/3;
- handle_cast/2;
- handle_info/2;
- terminate/2;
- code_change/3.
Distributed Erlang
Data = <<"hello">>. * Distributed Erlang — взаємодія Erlang nodes у distributed system.[3]
DETS схожий на disk-based варіант ETS, але має інші обмеження й performance characteristics. Для fault-tolerant систем критично тестувати не тільки “happy path”, а й падіння processes, timeouts, повтори й network issues. Для тестування коду в Erlang варто поєднувати:
Це корисно для систем, де деякі control messages не повинні довго чекати за великою чергою звичайних повідомлень. Головна сила OTP: ви не без зусиль пишете процеси.== Garbage collection ==
-module(example). У function clauses:
! * Supervisor — process, що контролює child processes. Erlang-системи потребують безпеки так само, як інші backend-системи.== Mailbox ==
Lightweight processes
Supervisors мають restart strategies. Приклад: Якщо cookies не збігаються, nodes не з’єднаються. * functions;
- recursion;
- pattern matching;
- immutable data;
- higher-order functions;
- lists;
- tuples;
- maps;
- anonymous functions;
- tail recursion. Потрібно контролювати:
User = #{id => 1, name => <<"Anna">>, active => true}. {error, not_found}
- network protocols;
- files;
- binary formats;
- strings as UTF-8 binaries;
- performance-sensitive data processing;
- messaging.
Elixir не замінює Erlang на 100%. add_test() -> * не ловити кожну помилку локально; * не залишати бізнес-процес у невідомому стані; * дати процесу впасти; * supervisor перезапустить його; * платформа продовжить працювати.<pre> Erlang здатна бути корисним у бізнесі, якщо потрібні: == Erlang і telecom == Приклад: Cowboy часто застосовується для для HTTP/WebSocket servers.<<"hello">> == Erlang і Elixir == ! * '''NIF''' — Native Implemented Function.<ref>https://www.erlang.org/blog/highlights-otp-28/</ref> Приклад: c(greeter).
Це інтуїтивно для distributed systems, але потребує обережності: Для документації: в Erlang критично вказувати не без зусиль “Erlang”, а конкретну версію Erlang/OTP: як приклад, OTP 28.5. * type discrepancies;
- unreachable code;
- pattern matching issues;
- potential bugs. Доступ:
- створення проєктів;
- builds;
- tests;
- dependencies;
- releases;
- plugins;
- Common Test;
- Dialyzer integration. Customer = #customer {id = 1, name = "Anna"}. Erlang cookie — секрет для node communication. A + B. Сенс:
Erlang підтримує typespecs. Вона використовує Erlang/OTP ecosystem, але має інший синтаксис і tooling. gen_server:cast(Server, {set_value, 42}). sum([]) -> 0;
Fault tolerance — здатність системи продовжувати роботу після часткових помилок. Erlang і Haskell обидві функціональні, але мають різну філософію. * protocols;
- parsers;
- state machines;
- business rules;
- serialization;
- distributed logic. Багато core libraries і OTP написані Erlang. як приклад:
Mnesia
Порівняння:
Erlang має web libraries/frameworks:
У контексті [[K2 ERP]] Erlang здатна бути корисним опосередковано: Типові команди: Приклад: <pre> Приклад: name, Supervisor здатна перезапускати child process, якщо той падає.[[Категорія:Тестування]] Erlang processes спілкуються через messages. * '''Hex.pm''' — package ecosystem для Erlang/Elixir. У OTP 28 з’явилися priority messages. * '''Process''' — легкий Erlang process у BEAM, не OS process. Node здатна надсилати messages process на іншому node майже так само, як локальному process. Вибір restart strategy — важлива архітектурна частина. Це критично для telecom і high-availability systems.== Releases == == gen_server == <div style="background:#fff0f0;border-left:6px solid #eb5757;padding:14px 18px;margin:16px 0;border-radius:8px;"> Application здатна мати: == Typespecs ==
Перед додаванням dependency потрібно перевіряти:
Це дає гнучкість, але здатна створити проблему, якщо mailbox росте швидше, ніж process обробляє повідомлення.
Треба розуміти різницю між lists і binaries, бо вона впливає на performance і APIs.== Binaries ==
Якщо message не підходить під pattern, він залишається в mailbox.== ETS == Erlang web stack менш mainstream, ніж Node.js, Python, Go, Java або C#, але сильний у concurrent connection handling.[4]
Monitor дає можливість одному process спостерігати за іншим без взаємного зв’язку. ?assertEqual(5, add(2, 3)). Erlang оптимізований для concurrency і availability, а не для raw CPU performance у стилі C/Rust. Erlang створювався для телекомунікаційних систем, де важливі:
Atoms часто використовують для status, tags, messages і pattern matching. "hello"
io:format("Hello from process~n")
X = 10,
- lightweight processes;
- scheduling;
- message passing;
- fault isolation;
- concurrency;
- soft real-time behaviour;
- garbage collection per process;
- distributed Erlang;
- hot code loading.== Atoms ==
У Erlang дуже поширений стиль:
EUnit
- logs;
- metrics;
- tracing;
- process inspection;
- crash reports;
- supervision tree visibility;
- mailbox length monitoring;
- memory monitoring;
- scheduler utilization;
- distributed node health.<<A:8, B:8, Rest/binary>> = Data. Мова !! * concurrency;
- fault tolerance;
- process isolation;
- distributed behaviour;
- message-oriented architecture. Erlang nodes використовують cookie для автентифікації між nodes.
hello() -> Erlang-код організовано в modules. * network partitions;
- consistency;
- message ordering;
- retries;
- duplicate messages;
- idempotency;
- cluster membership;
- observability;
- backpressure;
- failure domains. Приклад створення process:
Backpressure — механізм, який не дає можливість producer надсилати більше повідомлень, ніж consumer здатна обробити. # Використовувати gen_server для stateful servers, але не для всього.== Observer ==
Binaries використовуються для bytes і binary data. Releases важливі для production, бо Erlang-система часто складається з багатьох OTP applications. * Behaviour — OTP-шаблон із callbacks.== Erlang і Python / Go / Java / C# ==
id,
Це одна з причин, чому Erlang добре підходить для систем із багатьма одночасними процесами. -record(customer, { Erlang API особливо доречні, коли багато одночасних connections або WebSocket sessions.== Soft real-time ==
Erlang добре підходить для distributed systems, але не робить їх автоматизовано простими. * має власний стан;
- не ділить пам’ять напряму;
- отримує messages;
- обробляє messages послідовно;
- здатна створювати інші processes;
- здатна падати незалежно від інших.
== Erlang і RabbitMQ ==
<pre>
* telecom;
* messaging;
* chat;
* notification systems;
* real-time backend;
* distributed systems;
* high-availability services;
* fault-tolerant systems;
* process-per-connection architectures;
* protocol servers;
* RabbitMQ-like systems;
* IoT gateways;
* systems that must run continuously.[[Категорія:Telecom]]
error
<0.82.0>
Приклад:
Erlang дає інструменти, але архітектурні проблеми distributed systems залишаються. * '''Let it crash''' — філософія fault tolerance через контрольовані падіння й перезапуски. Помилка в native code здатна вплинути на всю VM, а не лише на один Erlang process. Отримання:
{| class="wikitable"
Erlang народився в telecom. Name = "Erlang". ETS корисний для:
ETS — in-memory tables для зберігання Erlang terms. '''gen_server''' — generic server behaviour. BEAM сильна в:
Erlang здатна створювати HTTP API через Cowboy або інші libraries. '''rebar3''' — популярний build tool для Erlang. Він корисний, коли бізнес-процес має чіткі стани й переходи між ними. * '''EUnit''' — unit testing framework. * висока доступність;
* обробка великої кількості одночасних з’єднань;
* відмовостійкість;
* гаряче оновлення версій коду;
* розподілена робота;
* ізоляція помилок;
draft
cast — коли потрібно без зусиль надіслати команду. Історично string в Erlang — це list of integers. OTP application — логічна одиниця Erlang-системи.== Records ==
-module(greeter). Для класичного CRUD API Erlang теж можливий, але часто Elixir/Phoenix або інші мови можуть бути зручнішими для команди. Tail recursion дає можливість runtime оптимізувати стек.Це оптимізує ізолювати паузи: GC одного process не мусить зупиняти всю VM.<pre> '''DETS''' — disk-based term storage.
├── Database Worker
Erlang і Haskell
Ідея:
Records — старіший спосіб описати structured data.Це легкі процеси всередині BEAM. * Priority messages — механізм OTP 28 для пріоритетних повідомлень. Pid ! * PID — process identifier.[5] Erlang не виступає як ERP-системою. Це сильно відрізняється від shared-memory threading. module:function/arity
Modules
Erlang і ERP-системи
Приклад:
Mnesia здатна бути доречною для:
- integration tests;
- system tests;
- protocol tests;
- distributed tests;
- telecom-style testing;
- complex setup/teardown. Можна створювати тисячі або мільйони Erlang processes, залежно від задачі й ресурсів. # Використовувати OTP behaviours. # Не створювати процеси без зрозумілого lifecycle. Він дає можливість створити багато маленьких процесів, які спілкуються повідомленнями. NIF здатна бути швидким, але небезпечним: поганий NIF здатна заблокувати або зламати VM. Вона історично корисна для Erlang-систем, але її потрібно використовувати обережно. * Dialyzer — static analysis tool для Erlang. {| class="wikitable"
Компіляція в shell:
Erlang підтримує hot code loading і hot upgrade.
Він знаходить:
Приклад:
Офіційна сторінка Erlang пояснює, що OTP — це набір Erlang libraries і design principles для middleware, distributed database, взаємодії з іншими мовами, debugging і release handling tools. receive
Основні behaviours:
== Tail recursion ==
[[Категорія:Інтеграції]]
Обмеження:
email
== Immutability ==
Pattern matching робить обробку повідомлень і структур дуже природною. * '''Common Test''' — framework для більших test suites.== Supervision tree ==
* messaging;
* telecom;
* real-time backend;
* high availability;
* distributed systems;
* IoT gateways;
* notification services;
* chat;
* queue systems;
* fault-tolerant services;
* systems that run 24/7. Приклад ідеї:
sum([], Acc) ->
* messaging;
* telecom sessions;
* chat;
* presence;
* notification systems;
* control planes. * комітити cookie в Git;
* використовувати однаковий cookie для всіх середовищ;
* писати cookie в logs;
* відкривати distributed Erlang ports у публічний інтернет без захисту. Її потрібно проектувати. {| class="wikitable"
gen_statem часто кращий за gen_server, коли логіка справді виступає як state machine. * '''Actor model''' — модель, де незалежні actors/processes спілкуються messages. Це означає: якщо бізнес-процес потрапив у неправильний стан, краще дати йому впасти, а supervisor перезапустить його в чистому стані. Observer корисний для локального аналізу й debugging. -export([hello/1]). * memory growth;
* latency;
* process overload;
* node instability.
sum([H | T]) -> H + sum(T). Інструменти можуть включати:
Erlang не має класичних loops як у багатьох імперативних мовах.== Erlang і тестування коду ==
Erlang shell запускається командою:
Erlang — функціональна мова.== Erlang у backend ==
- Elixir
- Haskell
- Go
- C Sharp
- Python
- PowerShell
- Assembly
- Visual Basic
- MATLAB
- Розробка в K2 ERP
- Тестування коду
- API K2 ERP
- Інтеграції K2 ERP
- Retrieval-Augmented Generation
- Великі мовні моделі
- GitHub Copilot
- Cursor
- Tabnine
- Штучний інтелект
- Генеративний AI
Саме ці вимоги сформували Erlang/OTP. * PropEr — property-based testing tool. PropEr — property-based testing tool для Erlang.== PropEr ==
rebar3 compile
Коли Erlang здатна бути невдалим вибором
[Head | Tail] = [1, 2, 3].== Applications ==
status_text(cancelled) -> "Скасовано". Priority messages — opt-in механізм, який дає можливість process отримувати певні urgent messages раніше, якщо receiver це підтримує. Map — key-value структура. Приклад:
- перезапустити тільки process, що впав;
- перезапустити всіх;
- перезапустити process і тих, хто залежить від нього.== Головна ідея ==
- навчання;
- testing small functions;
- process experiments;
- debugging;
- runtime inspection. * distributed Erlang cookie;
- TLS;
- input validation;
- authentication;
- authorization;
- secrets;
- dependency security;
- NIF risks;
- exposed ports;
- node connectivity;
- logging;
- remote shell access;
- configuration;
- cluster access.== BEAM VM ==
gen_server:call(Server, get_state).
gen_statem
Не можна: 5
sum([H | T], Acc) -> Це дає стандартну структуру для production-процесів.Erlang оптимізує через:== Синтаксис Erlang ==