Перейти до вмісту

Erlang

Матеріал з K2 ERP Wiki

├── Database Worker

gen_statem


* висока доступність;
* обробка великої кількості одночасних з’єднань;
* відмовостійкість;
* гаряче актуалізація коду;
* розподілена робота;
* ізоляція помилок;
Це надає можливість явно обробляти успіх і помилку.; * '''Common Test''' — framework для більших test suites.; Станом на травень 2026 року офіційна сторінка Downloads вказує '''Erlang/OTP 28.5''' як latest version of Erlang/OTP.; * '''Message passing''' — передача повідомлень між processes.; Common Test часто застосовується в серйозних Erlang/OTP проєктах.; Для production persistence потрібно обережно оцінювати, чи DETS справді підходить.; # Обережно використовувати NIFs.; status_text(cancelled) -> "Скасовано".;

Історично string в Erlang — це list of integers.; * Distributed Erlang — взаємодія Erlang nodes у distributed system.; Це одна з причин, чому Erlang добре підходить для систем із багатьма одночасними процесами.; Для fault-tolerant систем істотно тестувати не тільки “happy path”, а й падіння processes, timeouts, повтори й network issues.; Erlang не є собою ERP-системою.; Змінні в Erlang присвоюються один раз.; Erlang доречний тоді, коли його fault-tolerance модель справді потрібна.;== Типові помилки в Erlang ==

Обмеження:

== Mnesia ==
Приклад сценарію:

 ├── Session Worker 2
== Soft real-time ==
Не можна випадково публікувати Erlang cookie в репозиторії або logs.; Fault tolerance — здатність системи продовжувати роботу після часткових помилок.;
  • менший ринковий сегмент розробників;
  • незвичний синтаксис;
  • менша mainstream web ecosystem;
  • не найкращий вибір для CPU-heavy задач;
  • distributed systems усе одно складні;
  • потрібна дисципліна OTP architecture;
  • NIFs можуть зламати fault tolerance;
  • observability і backpressure потрібно проектувати.; з цієї причини часто говорять не без ускладнень Erlang, а Erlang/OTP.; User = #{id => 1, name => <<"Anna">>, active => true}.; └── Session Worker 3

== Binaries ==

Кожен process:

* messaging;
* telecom sessions;
* chat;
* presence;
* notification systems;
* control planes.;== Rebar3 ==

Приклад ідеї:

'''BEAM''' — virtual machine, на якій виконується Erlang-код.; # Моніторити BEAM runtime metrics.; Data = <<"hello">>.; ETS — in-memory tables для зберігання Erlang terms.;== Erlang і Web ==

Головна сила OTP: ви не без ускладнень пишете процеси.;

Applications

Приклад:

  • Cowboy;
  • Ranch;
  • Elli;
  • Webmachine historically;
  • Zotonic;
  • ChicagoBoss historically.; Це дає гнучкість, але має змогу створити проблему, якщо mailbox росте швидше, ніж process обробляє повідомлення.; add_test() ->

Сьогодні Erlang застосовують, коли потрібно не тільки в telecom, а й у messaging systems, real-time backend, distributed systems, IoT, фінансових системах, chat-серверах, брокерах повідомлень і high-availability інфраструктурі.; Supervisor має змогу перезапускати child process, якщо той падає.; Приклад:

  • observer;
  • recon;
  • telemetry;
  • OpenTelemetry;
  • logs;
  • custom metrics;
  • VM statistics.; У контексті K2 ERP Erlang має змогу бути корисним опосередковано:
  • потрібен простий CRUD;
  • команда не знає Erlang/OTP;
  • потрібен великий ринковий сегмент розробників;
  • потрібен CPU-heavy numerical code;
  • потрібна AI/data science ecosystem;
  • потрібен mobile app;
  • потрібен modern mainstream web stack;
  • fault tolerance не є собою важливою вимогою;
  • платформа без зайвих зусиль вирішується Go/C#/Java/Python;
  • немає плану observability і OTP architecture.; Але основну бізнес-логіку ERP зазвичай варто писати в основному стеку системи.; Property-based testing перевіряє не один приклад, а властивості програми на багатьох generated inputs.; example:hello/0

істотно: NIF — це місце, де Erlang має змогу втратити частину своєї fault tolerance.; Erlang processes спілкуються через messages.; |- | Erlang || fault-tolerant distributed runtime, processes, message passing, OTP |- | Haskell || чисті функції, сильна type system, lazy evaluation, математичне моделювання |}

Вона підтримує роботу:

Це основа для supervisor-like behaviour і fault detection.; * type discrepancies;

  • unreachable code;
  • pattern matching issues;
  • potential bugs.;

WhatsApp історично часто згадується як приклад системи, яка використовувала Erlang для масштабної messaging infrastructure.; {hello, "Erlang"}.;

Коли Erlang має змогу бути невдалим вибором

call комфортно використовувати, коли потрібна відповідь.; Але для сучасної роботи з текстом і network data часто використовують binaries:

Mnesia має змогу бути доречною для: Потрібно думати про:

id,

status_text(draft) -> "Чернетка";

Pid = spawn(fun() ->

Pid !; Сильні сторони:

Pattern matching — центральна частина Erlang.; Let it crash — філософія Erlang.;

{{SEO


'''Arity''' — кількість аргументів функції.; * '''Binary''' — binary data у Erlang.; BEAM — одна з головних причин, чому Erlang добре підходить для high-concurrency systems.; {hello, Name} ->
Erlang підтримує роботу typespecs.;<pre>
<pre>
'''Mnesia''' — distributed database management system, що входить в OTP.; Головна ідея Erlang — будувати системи з багатьох легких ізольованих процесів, які спілкуються повідомленнями.; # Стежити за mailbox length.; # Не створювати atoms із user input.; '''Behaviour''' — OTP-шаблон для типових процесів.; У багатьох сучасних deployment-процесах замість hot upgrade використовують rolling deploy або blue-green deploy, але сама можливість залишається важливою частиною Erlang-історії.; * '''gen_server''' — generic server behaviour.; Erlang web stack менш mainstream, ніж Node.js, Python, Go, Java або C#, але сильний у concurrent connection handling.; Порівняння:
2> self().;<div style="background:#fff0f0;border-left:6px solid #eb5757;padding:14px 18px;margin:16px 0;border-radius:8px;">

== Erlang shell ==

Порівняння:

* Erlang runtime;
* applications;
* configuration;
* boot scripts;
* release metadata;
* versioning;
* upgrade instructions.; '''Monitor''' надає можливість одному process спостерігати за іншим без взаємного зв’язку.; 5

hello(Name) ->
У gen_server є собою два типові способи взаємодії:
|-
| '''Erlang''' || оригінальна мова OTP, telecom roots, дуже стабільна
|-
| '''Elixir''' || сучасніший синтаксис, Mix tooling, Phoenix web framework, ширша популярність у web
|}

Numbers = [1, 2, 3, 4].; # Проектувати supervision tree з самого початку.;

ETS — Erlang Term Storage.; Для high-concurrency I/O systems — часто дуже сильний.; Erlang/OTP 28 був випущений 21 травня 2025 року як новий major release з новими можливостями, покращеннями й деякими несумісностями.; Supervisors мають restart strategies.;== Hex.pm ==

sum([H | T], Acc) -> Але hot upgrades складні:
  • крапки в кінці function definitions;
  • коми між expressions;
  • крапку з комою між clauses;
  • atoms;
  • pattern matching;
  • single assignment.;
Erlang підтримує роботу hot code loading і hot upgrade.; Supervision tree — дерево supervisors і workers.; Hex.pm — package manager ecosystem для Erlang/Elixir.; * 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.;
'''Dialyzer''' — static analysis tool для Erlang.; * '''Hot code upgrade''' — актуалізація коду без повної зупинки системи.; * '''Let it crash''' — філософія fault tolerance через контрольовані падіння й перезапуски.; sum(T, Acc + H).; Мова !!; Вона історично корисна для Erlang-систем, але її потрібно використовувати обережно.;<ref>https://www.erlang.org/</ref> '''Erlang''' — це мова програмування.; draft Erlang і [[Haskell]] обидві функціональні, але мають різну філософію.; Мова !!; Цей підхід функціонує тільки тоді, коли правильно побудовані supervision trees, state boundaries і recovery strategy.; Функції ідентифікуються як: як ілюстрація: == Erlang і OTP == == Безпека == Erlang створювався для телекомунікаційних систем, де важливі: * має власний стан; * не ділить пам’ять напряму; * отримує messages; * обробляє messages послідовно; * має змогу створювати інші processes; * має змогу падати незалежно від інших.; Створюється нове значення <code>Y</code>.;<0.82.0> Cookie потрібно зберігати як секрет.; 1> 2 + 3.; Це дає стандартну структуру для production-процесів.;== Let it crash == == Erlang і Python / Go / Java / C# == * писати 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.; Мова !!; Erlang — це не без ускладнень функціональна мова.; * '''OTP''' — набір Erlang libraries, behaviours і design principles для production systems.;== Erlang і RabbitMQ == <pre>

Haskell сильніший у type-driven correctness і pure functional modeling.;[1]

rebar3 ct

Замість того щоб боятися кожної помилки, Erlang пропонує підхід:

  • supervisors;
  • gen_server;
  • gen_statem;
  • applications;
  • releases;
  • logging;
  • distributed tools;
  • release handling;
  • debugging tools;
  • стандартні design patterns.; * protocols;
  • parsers;
  • state machines;
  • business rules;
  • serialization;
  • distributed logic.; # Використовувати gen_statem для state machines.;== Erlang і API ==

Він застосовується для процесів, які мають state і обробляють requests/messages.; -spec add(integer(), integer()) -> integer().; Сильні сторони

  • підтримку;
  • ліцензію;
  • сумісність з OTP;
  • активність;
  • транзитивні залежності;
  • security issues.; Помилка в native code має змогу вплинути на всю VM, а не лише на один Erlang process.; * ETS — in-memory storage для Erlang terms.;
'''Elixir''' — сучасна мова на BEAM VM.; * '''Pattern matching''' — зіставлення значень із шаблонами.; Erlang має змогу бути невдалим вибором, якщо: == Практичний висновок == * isolated processes; * supervisors; * links; * monitors; * message passing; * supervision trees; * crash recovery; * distribution; * process-per-connection style; * hot code loading.; {ok, 42} завдяки наявності Message passing користувачі можуть уникати shared mutable state.; sum([], Acc) -> Ідея: <<A:8, B:8, Rest/binary>> = Data.;</div> Коли process отримує message, він має змогу обробити його через <code>receive</code>.;== Common Test == == Dialyzer == <pre> ok * network protocols; * files; * binary formats; * strings as UTF-8 binaries; * performance-sensitive data processing; * messaging.;<pre> На performance впливають: <pre> hello() -> == Typespecs == == Erlang і Elixir == EUnit корисний для маленьких unit tests.;

Application Supervisor

Erlang найкраще використовувати там, де головна вимога — не без ускладнень виконати код, а побудувати систему, яка продовжує працювати під навантаженням, при помилках і в distributed environment.;

Erlang syntax має змогу здаватися незвичним через:

Але fault tolerance не виникає автономно.;== BEAM VM ==

інформаційні дані в Erlang immutable.;[2] Module має ім’я й список exported functions.; Ви описуєте, хто за ким стежить, що робити після падіння, як перезапускати частини системи й де проходять межі відмови.;== Mailbox == Pattern matching робить обробку повідомлень і структур дуже природною.; * Dialyzer — static analysis tool для Erlang.; Якщо cookies не збігаються, nodes не з’єднаються.;== supervisor ==

Erlang і ERP-системи

Distributed Erlang надає можливість Erlang nodes спілкуватися між собою.; * Process — легкий Erlang process у BEAM, не OS process.; {ok, Value} = {ok, 42}.; }).; * Rebar3 — build tool для Erlang.; RabbitMQ — популярний message broker, написаний на Erlang.; Name = "Erlang".; -module(example).; Якщо один працівник помилився, керівник не зупиняє всю компанію, а перезапускає саме цю ділянку роботи.;
X = 10,

<div style="background:#fff7e6;border-left:6px solid #f2994a;padding:14px 18px;margin:16px 0;border-radius:8px;">

Без backpressure можливі:

== Performance ==

Erlang nodes використовують cookie для автентифікації між nodes.; Приклад:

status_text(paid) -> "Оплачено";

Типові стратегії:

  • memory growth;
  • latency;
  • process overload;
  • node instability.; Tuple — фіксована структура.; Офіційна документація supervisor behavior описує supervisor як process, що supervises child processes; child process має змогу бути іншим supervisor або worker process, зазвичай реалізованим через gen_server, gen_statem або gen_event.;

Дивіться додатково

OTP application — логічна одиниця Erlang-системи.; * Supervisor — process, що контролює child processes.; Це компонент системи.; * Hex.pm — package ecosystem для Erlang/Elixir.; OTP application — не обов’язково “додаток” у звичному UI-сенсі.;

  • concurrency;
  • fault tolerance;
  • process isolation;
  • distributed behaviour;
  • message-oriented architecture.; * EUnit — unit testing framework.; Треба розуміти різницю між lists і binaries, бо вона впливає на performance і APIs.; !; * Tuple — фіксована структура значень.;
Tail recursion надає можливість runtime оптимізувати стек.; sum([H | T]) -> H + sum(T).; Erlang сприяє через: io:format("Hello from process~n") Dialyzer використовує success typing, а не класичну повну статичну типізацію.; Сценарії: Pattern matching зі списком: Erlang має потужний binary pattern matching: <pre> <<"hello">> Для Erlang production-систем потрібні: Він корисний для: * init/1; * handle_call/3; * handle_cast/2; * handle_info/2; * terminate/2; * code_change/3.; sum([]) -> 0;

Ports і NIFs

email

 sum(List, 0).; Для production потрібні network isolation, firewall, secrets management і TLS, якщо доречно.; Приклад:
Приклад:
'''Коротко:''' Erlang — це мова й платформа для систем, які мають не без ускладнень “працювати”, а продовжувати працювати навіть тоді, коли окремі частини падають.; '''Link''' створює двосторонній зв’язок: якщо один process падає, сигнал отримує інший.;

Приклад модуля:

Erlang у backend

error NIF — Native Implemented Function, код на C/C++, який викликається всередині BEAM.; "hello"

  • перезапустити тільки process, що впав;
  • перезапустити всіх;
  • перезапустити process і тих, хто залежить від нього.; Приклад:

Distributed Erlang

Хороші практики

застосовується для dependencies.; Erlang народився в telecom.; * Application — OTP application, логічна одиниця системи.; Проста аналогія: Erlang-система схожа на добре організовану команду.;

Поширені помилки:

* 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.;== Пояснення термінів ==

rebar3 release

Erlang має змогу взаємодіяти з зовнішнім кодом через ports і NIFs.; module:function/arity

Rebar3 — стандартний вибір для багатьох Erlang-проєктів.; Він застосовується для:

Це істотно для telecom і high-availability systems.; У OTP 28 з’явилися priority messages.; Приклад:

Приклад:

Він знаходить:

* processes;
* applications;
* memory;
* scheduler info;
* ETS tables;
* supervision trees.; Поведінка runtime, libraries і tooling має змогу залежати від OTP-релізу.; {ok, Result}

[[Категорія:Backend]]

[[Категорія:Тестування]]

Типові команди:

Для довгих циклів важлива tail recursion.;== Observability ==

Це сприяє ізолювати паузи: GC одного process не мусить зупиняти всю VM.;<pre>

Це один із найвідоміших прикладів практичного використання Erlang/OTP.; Records — старіший спосіб описати structured data.;== Strings ==

Behaviour визначає callback functions, які module має реалізувати.; Erlang дає інструменти, але архітектурні проблеми distributed systems залишаються.; Якщо message не підходить під pattern, він залишається в mailbox.;<pre>

* network partitions;
* security;
* node cookies;
* latency;
* cluster topology;
* observability;
* failure detection.;== Garbage collection ==

<code>X</code> не змінюється.; Для класичного CRUD API Erlang теж можливий, але часто Elixir/Phoenix або інші мови можуть бути зручнішими для команди.; greeter:hello("Erlang").; BEAM додатково виконує інші мови, зокрема [[Elixir]].; {| class="wikitable"

* caches;
* lookup tables;
* shared read-heavy data;
* session data;
* counters;
* local state.; * '''gen_statem''' — behaviour для state machines.; {error, not_found}
[[Категорія:Fault Tolerance]]
Це істотно для exports, callbacks і documentation.;== gen_server ==

[[Категорія:Програмування]]

Erlang практичніший для resilient runtime systems.;

cancelled Records часто зустрічаються в старому Erlang-коді.;== Actor model ==

ETS

Erlang і telecom

{customer, 10, "Anna"}

Кожен Erlang process має mailbox — чергу повідомлень.;
  • HTTP listener приймає request;
  • process обробляє session;
  • gen_server керує state;
  • supervisor перезапускає workers;
  • response повертається client.; Application має змогу мати:
Erlang cookie — секрет для node communication.; * PID — process identifier.; * NIF — Native Implemented Function.; Common Test — testing framework для більших test suites.;

* створення проєктів;
* builds;
* tests;
* dependencies;
* releases;
* plugins;
* Common Test;
* Dialyzer integration.;== Lightweight processes ==
Інструменти можуть включати:

'''Supervisor''' — бізнес-процес, який контролює child processes.; У Erlang <code>foo/1</code> і <code>foo/2</code> — різні функції.; * робота 24/7.; '''rebar3''' — популярний build tool для Erlang.; cast — коли потрібно без ускладнень надіслати команду.;== Message passing ==

Let it crash

  • lightweight processes;
  • scheduling;
  • message passing;
  • fault isolation;
  • concurrency;
  • soft real-time behaviour;
  • garbage collection per process;
  • distributed Erlang;
  • hot code loading.;
  • logs;
  • metrics;
  • tracing;
  • process inspection;
  • crash reports;
  • supervision tree visibility;
  • mailbox length monitoring;
  • memory monitoring;
  • scheduler utilization;
  • distributed node health.; * документації;
  • Dialyzer;
  • API contracts;
  • code navigation;
  • maintenance.; Використання:
; # Захищати Erlang cookie.;

EUnit

Перед додаванням dependency потрібно перевіряти:

  • навчання;
  • testing small functions;
  • process experiments;
  • debugging;
  • runtime inspection.;== Tuples ==

ETS не є собою заміною persistent database, але дуже корисний для runtime state.; Erlang processes — це не операційні системні процеси.;== Immutability ==

sum(List) ->

Tail recursion

Сенс:

Це сильно відрізняється від shared-memory threading.;== Erlang у бізнесі ==

Erlang добре підходить для soft real-time:

Приклад:

Restart strategies

  • не ловити кожну помилку локально;
  • не залишати бізнес-процес у невідомому стані;
  • дати процесу впасти;
  • supervisor перезапустить його;
  • платформа продовжить працювати.;[3]

<pre>

[Head | Tail] = [1, 2, 3].; Замість цього застосовується recursion.; {error, Reason}

Приклад:

BEAM сильна в:

== Актуальна реліз ==
Supervision tree — основа Erlang fault tolerance.; gen_statem часто кращий за gen_server, коли логіка справді є собою state machine.; name,

У function clauses:

Приклад створення process:

[[Категорія:Actor Model]]

== Behaviours ==

Це комфортно для distributed systems, але потребує обережності:

Звичайно повідомлення додаються в кінець черги процесу.; Release має змогу включати:
 io:format("Hello~n").; Maps корисні для structured data, configs, JSON-like structures і API payloads.; * protocols;
* connection lifecycle;
* payment workflow;
* device states;
* session management;
* telecom flows.; * 24/7 availability;
* soft real-time;
* hot upgrade;
* fault isolation;
* distributed operation;
* call/session management;
* supervision;
* message passing.;<pre>

 io:format("Hello, ~s~n", [Name]).; Name = maps:get(name, User).;== Releases ==

У такому підході платформа складається з незалежних actors/processes.;
  • потрібно думати про state migration;
  • old і new code можуть співіснувати;
  • callbacks code_change/3 мають бути правильними;
  • release handling має бути протестований.; Він надає можливість створити багато маленьких процесів, які спілкуються повідомленнями.; * Mnesia — distributed database в OTP.; rebar3 eunit

-export([hello/0]).; Основні behaviours:

  • 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.;== Джерела ==
  • кількість processes;
  • mailbox sizes;
  • message copying;
  • binary handling;
  • scheduler utilization;
  • garbage collection;
  • ETS usage;
  • NIFs;
  • distribution overhead;
  • serialization;
  • supervision restarts.; * integration tests;
  • system tests;
  • protocol tests;
  • distributed tests;
  • telecom-style testing;
  • complex setup/teardown.; Не можна:

Сценарії:

receive

Erlang можна використовувати для backend-сервісів.; # Використовувати gen_server для stateful servers, але не для всього.;

Process має PID — ідентифікатор процесу.; └── Session Supervisor

Binaries використовуються для bytes і binary data.;

В Erlang backpressure важливий, бо mailbox process має змогу рости.; * distributed Erlang applications;

  • metadata;
  • telecom-like systems;
  • small/medium distributed state;
  • systems tightly integrated with Erlang nodes.;

-module(greeter).;== Maps ==

== Lists ==


gen_server:cast(Server, {set_value, 42}).;[[Категорія:Функціональне програмування]]
Це легкі процеси всередині BEAM.; rebar3 new app my_app
Приклад:
Releases важливі для production, бо Erlang-система часто складається з багатьох OTP applications.; У BEAM garbage collection зазвичай process-local.;<pre>

'''Backpressure''' — механізм, який не надає можливість producer надсилати більше повідомлень, ніж consumer має змогу обробити.; Особливість
Customer = #customer {id = 1, name = "Anna"}.; rebar3 compile
Binaries важливі для:
'''PropEr''' — property-based testing tool для Erlang.; Багато core libraries і OTP написані Erlang.; Це означає: якщо бізнес-процес потрапив у неправильний стан, краще дати йому впасти, а supervisor перезапустить його в чистому стані.;== Variables ==

== Supervision tree ==

Приклад ідеї:
<pre>
|-
| '''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 API особливо доречні, коли багато одночасних connections або WebSocket sessions.; Для [[Тестування коду|тестування коду]] в Erlang варто поєднувати:

end).; A + B.; це функціональна мова програмування і runtime-платформа; додатково реалізовано distributed і fault-tolerant систем виступає ключовою рисою побудови concurrent забезпечується через '''Erlang'''.; # Додавати EUnit і Common Test.; Але Erlang має менший ринковий сегмент розробників, ніж mainstream backend-мови.; * '''Arity''' — кількість аргументів функції.; Але для hard real-time embedded control Erlang зазвичай не є собою першим вибором.; Erlang-код організовано в modules.; Erlang має web libraries/frameworks:

erl

Erlang-системи потребують безпеки так само, як інші backend-системи.; Вибір restart strategy — важлива архітектурна частина.; '''gen_server''' — generic server behaviour.; Вона використовує Erlang/OTP ecosystem, але має інший синтаксис і tooling.; Elixir не замінює Erlang в цілому.; Типові callbacks:

== Erlang і тестування коду ==

[[Категорія:Messaging]]

* EUnit для unit tests;
* Common Test для integration/system tests;
* PropEr для property-based tests;
* Dialyzer для static analysis;
* release tests;
* distributed tests;
* fault injection;
* supervisor restart tests.; Immutability сприяє:

== Erlang і distributed systems ==

Y = X + 5.; # Використовувати Dialyzer і typespecs.; Це корисно для систем, де деякі control messages не повинні довго чекати за великою чергою звичайних повідомлень.; '''EUnit''' — unit testing framework для Erlang.;== Atoms ==

NIF має змогу бути швидким, але небезпечним: поганий NIF має змогу заблокувати або зламати VM.;<ref>https://www.erlang.org/doc/apps/stdlib/supervisor.html</ref>

== Backpressure ==

Erlang добре підходить для distributed systems, але не робить їх автономно простими.; Значення не змінюються після створення.;== Erlang cookie security ==

gen_server:call(Server, get_state).;== Records ==
 ?assertEqual(5, add(2, 3)).; add(A, B) ->

* уникати race conditions;
* спростити reasoning;
* зробити процеси ізольованими;
* краще працювати з message passing.;<pre>

== Node cookie ==
Але Erlang дуже практичний: його функціональність служить не академічній красі, а побудові надійних систем.;== Erlang і WhatsApp ==

Якщо pattern не збігається, буде error.; Ідея: можна оновити код без повної зупинки системи.; * '''Mailbox''' — черга повідомлень процесу.; Він не веде обліковий облік, не проводить документи й не керує складом сам по собі.;

Для CPU-heavy задач Erlang має змогу бути не найкращим вибором.; Erlang shell запускається командою:

Observer корисний для локального аналізу й debugging.; Ключова ідея: Erlang не намагається зробити один бізнес-процес дуже складним.; Processes можуть бути linked або monitored.; * Elixir


* [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]

'''Для документації:''' в Erlang істотно вказувати не без ускладнень “Erlang”, а конкретну версію Erlang/OTP: як ілюстрація, OTP 28.5.;[[Категорія:Telecom]]

Серед помітних новинок OTP 28 офіційно затверджений блог виділяє '''priority messages''' — opt-in механізм, який надає можливість процесу отримувати деякі urgent messages раніше за звичайні повідомлення в черзі.; # Використовувати OTP behaviours.; * <code>Head</code> буде <code>1</code>;
* <code>Tail</code> буде <code>[2,3]</code>.; ├── HTTP Listener

* комітити cookie в Git;
* використовувати однаковий cookie для всіх середовищ;
* писати cookie в logs;
* відкривати distributed Erlang ports у публічний інтернет без захисту.;<pre>

<div style="background:#f6ffed;border-left:6px solid #27ae60;padding:14px 18px;margin:16px 0;border-radius:8px;">

* <code>call</code> — синхронний request із відповіддю;
* <code>cast</code> — асинхронне повідомлення без очікування відповіді.; * '''Actor model''' — модель, де незалежні actors/processes спілкуються messages.; Цей приклад важливий не як “магічна реклама Erlang”, а як демонстрація того, що Erlang добре підходить для великої кількості одночасних з’єднань і messaging.; як ілюстрація:

== Hot code upgrade ==

ETS корисний для:

'''gen_statem''' — behaviour для state machines.; OTP охоплює:

'''OTP''' — це набір libraries, behaviours, design principles і tooling для побудови production-систем на Erlang.; Відправка повідомлення:
Erlang — функціональна мова.; Особливо уважно потрібно ставитися до distributed Erlang у відкритих мережах.; * network partitions;
* consistency;
* message ordering;
* retries;
* duplicate messages;
* idempotency;
* cluster membership;
* observability;
* backpressure;
* failure domains.; '''Soft real-time''' означає, що платформа має реагувати оперативно й стабільно, але не гарантує жорстких real-time deadlines як hard real-time systems.;== Priority messages ==
Це називають single assignment.; Для багатьох сучасних web/backend систем частіше використовують PostgreSQL, Redis, Kafka, RabbitMQ або інші спеціалізовані сховища.; Фокус
c(greeter).; * '''Supervision tree''' — дерево supervisors і workers.; io:format("Hello, ~s~n", [Name])

add(A) -> A + 1.; Саме ці вимоги сформували Erlang/OTP.;== Erlang і Haskell ==

* gen_server;
* gen_statem;
* gen_event;
* supervisor;
* application.; DETS схожий на disk-based варіант ETS, але має інші обмеження й performance characteristics.;<ref>https://www.erlang.org/blog/highlights-otp-28/</ref>

<pre>

== Головна ідея ==
істотно: atoms не збираються garbage collector у звичайному сенсі, з цієї причини не можна безконтрольно створювати atoms із зовнішнього input.; * application callback module;
* supervision tree;
* config;
* dependencies;
* workers;
* release metadata.;<ref>https://www.erlang.org/blog/highlights-otp-28/</ref>

* distributed Erlang cookie;
* TLS;
* input validation;
* authentication;
* authorization;
* secrets;
* dependency security;
* NIF risks;
* exposed ports;
* node connectivity;
* logging;
* remote shell access;
* configuration;
* cluster access.; {| class="wikitable"
Erlang часто описують через '''actor model'''.; Приклад:

Tail recursion — recursion, де recursive call є собою останньою операцією функції.; end.; * messaging;

  • telecom;
  • real-time backend;
  • high availability;
  • distributed systems;
  • IoT gateways;
  • notification services;
  • chat;
  • queue systems;
  • fault-tolerant services;
  • systems that run 24/7.; * Behaviour — OTP-шаблон із callbacks.; # Думати про backpressure.; * Atom — іменована константа.;
Приклад: Erlang має змогу бути корисним у бізнесі, якщо потрібні: * functions; * recursion; * pattern matching; * immutable data; * higher-order functions; * lists; * tuples; * maps; * anonymous functions; * tail recursion.;== call і cast == == PropEr == Erlang release — зібрана платформа для deployment.;== Fault tolerance == paid </div> !; Cowboy часто застосовується для HTTP/WebSocket servers.; Це добре підходить для: Потрібно проектувати flow control.; Можна створювати тисячі або мільйони Erlang processes, залежно від задачі й ресурсів.; Erlang не має класичних loops як у багатьох імперативних мовах.;[[Категорія:Erlang]] У Erlang дуже поширений стиль: * '''Erlang''' — функціональна мова й runtime-платформа для concurrent і fault-tolerant systems.; * '''PropEr''' — property-based testing tool.; Це платформа для побудови систем, які мають жити довго, обробляти багато одночасних подій і відновлюватися після помилок.; Офіційна документація gen_server пояснює, що gen_server має змогу створювати process як частину supervision tree через <code>start_link</code>, а process викликає <code>Module:init/1</code> для ініціалізації.; Він корисний, коли бізнес-процес має чіткі стани й переходи між ними.; Приклад: == Function arity == [[Категорія:Concurrency]] '''Port''' — безпечніший спосіб спілкування із зовнішньою програмою як окремим OS process.; # Не створювати процеси без зрозумілого lifecycle.; Priority messages — opt-in механізм, який надає можливість process отримувати певні urgent messages раніше, якщо receiver це підтримує роботу.;== Recursion == <pre> Shell корисний для: * messaging backend; * chat server; * presence system; * notification service; * IoT gateway; * protocol server; * multiplayer coordination; * distributed control plane; * queue workers; * real-time systems.;[[Категорія:Distributed Systems]] add(A, B) -> A + B.; # Описувати message formats.; Під час роботи з Erlang варто: Node має змогу надсилати messages process на іншому node майже так само, як локальному process.; Офіційна сторінка Erlang пояснює, що OTP — це набір Erlang libraries і design principles для middleware, distributed database, взаємодії з іншими мовами, debugging і release handling tools.; * '''Map''' — key-value структура.; '''DETS''' — disk-based term storage.; Atoms часто використовують для status, tags, messages і pattern matching.;

Отримання:

Erlang найсильніший там, де потрібні concurrency, fault tolerance і long-running systems.; Приклади:

Atom — іменоване константне значення.; # Тестувати crash/restart scenarios.; Її потрібно проектувати.; Typespecs корисні для:

Це означає, що він часто знаходить реальні проблеми, але не вимагає описувати всі типи наперед.;== DETS ==

Доступ:

Erlang оптимізований для concurrency і availability, а не для raw CPU performance у стилі C/Rust.; * Priority messages — механізм OTP 28 для пріоритетних повідомлень.; Це не означає “писати поганий код”.; * Release — зібрана Erlang/OTP-система для deployment.; * BEAM — virtual machine для Erlang і Elixir.; Приклад:

Erlang має змогу створювати HTTP API через Cowboy або інші libraries.; Erlang особливо корисний для:

Компіляція в shell:

Acc;
  • one_for_one;
  • one_for_all;
  • rest_for_one;
  • simple_one_for_one historically / dynamic supervisors у новіших підходах.; -export([hello/1]).;== Functional programming ==

Observer — Erlang GUI tool для перегляду runtime-системи.;== Modules ==

Map — key-value структура.;
├── Session Worker 1

Observer

List — базова структура даних.; -record(customer, {
RabbitMQ використовує сильні сторони Erlang:
Він має змогу показувати:
== Pattern matching ==
== Синтаксис Erlang ==
Telecom systems потребували:

Коли Erlang особливо корисний

Тут: Потрібно контролювати: