ВСТУП

МОТИВАЦІЯ

N2O сервер, а також NITRO веб-фреймворк були спроектовані як інструментільні засоби для створення промислових ERP модулів підприємства у складі відкритої платформи ERP.UNO. Напочатку, N2O був відгалужений, як оптимізована версія веб-фреймворку Nitrogen, створеного Расті Клопгаузом. Хотілося оптимізувати та вдосконалити мінімізований WebSocket-тракт, який не містить синхронного протоколу HTTP взагалі та дозволяє створювати повноцінні асинхронні веб-додатки реального часу. На ньому була створена система управління депозитами в національному банку ПриватБанк. Пізніше N2O був розділений на бібліотеку-фреймворк процесів та протоколів (власне N2O) та бібліотеку-веб-фреймворк NITRO. Бібліотеки N2O та NITRO також отримали можливість роботи не тільки через WebSocket але і через MQTT та через чисті TCP або UDP. Така оновлена версія 5.10 була впроваджена як ядро системи повідомлень для додатку NYNJA з відкритим open-source протоколом і саме ій присвячений друга версія підручника.

БІБЛІОТЕКИ

Для запезпечення повноцінної промислової специфікації ERP.UNO, ми розширили набір інструментальних засобів наступними бібліотеками: формальними представленнями презентаційного рівня FORM та системою управління бізнес-процесів BPE. FORM представляє собою декларативну бібліотеку побудови графічних інтерфейсів, а бібліотека BPE підтримує XML файли стандарту BPMN 2.0 та реалізує безпосередню інтерналізацію BPMN семантики у семантику віртуальної машини Erlang.

Ядро бібліотек які реалізують фундацію N2O.DEV (організація SYNRC) для системи управління підприємствами ERP.UNO (організація ERPUNO) у версії 8.0 виглядає наступним чином:

  • N2O — 930 — сервер протоколів для стандартів MQTT, WebSocket, QUIC
  • 🔥 NITRO — 3800 — веб-фреймворк Nitrogen та його контрольні елементи
  • 💿 KVS — 600 — бібліотека доступу до KV сховищ RocksDB та SpanDB/NVMe
  • 🧾 FORM — бібліотека декларативного конструювання інтерфейсів
  • 💠 BPE — 980 — сисема управління процесами стандарту BPMN 2.0
  • ☎️ RPC — 550 — бібліотека генерації SDK для мов JS, protobuf, Swift, Kotlin

ПРИКЛАДИ

Головні приклади фундації N2O.DEV присвячені наступним темам: MQTT та WebSocket чати для демонстрації веб-фреймворку NITRO, який працює як модуль N2O, приклад REST адаптер до бази даних KVS, та повністю чистий N2O додаток CHAT на основі бібліотеки SYN без використання NITRO:

  • 💧 SAMPLE — 120 — ідіоматичний приклад Nitrogen поверх WebSocket
  • 💧 REVIEW — 120 — ідіоматичний приклад Nitrogen поверх MQTT
  • REST — 800 — бібліотека для побудови HTTP API
  • 💬 MAIL — 80 — ідіоматичний приклад системи доставки повідомлень
  • 💬 CHAT — 5000 — ідіоматичний месенджер

ІНСТРУМЕНТИ

Цей посібник більше присвячений бібліотекам N2O та NITRO, та лише незначним чином торкається сховища даних KVS. Пізніше нами було проінвестовано ще у наступні бібліотеки, які в основному стосуються створення API та керування пакетами та інстансами:

  • MAD — 1420 — бібліотека управління пакетами та інстансами
  • 📁 FS — 320 — бібліотека управління файловою системою
  • 🐋 ACTIVE — 190 — бібліотека перекомпіляції

Кожна бібліотека розкриватиметься у наступних навчальних посібниках, що вийдуть згодом.

СЕРЕДОВИЩЕ

Для забезпечення повного замкненого середовища пропонують наступні заміни бібліотек kernel та stdlib:

  • 🚀 VM — 1700 — віртуальна машина середовища виконання
  • BASE — базова системна бібліотека як заміна stdlib
  • RT — бібліотека середовища виконання як заміна kernel
  • 📨 SYN — 1700 — бібліотека PubSub для розподілених систем

Концептуальна модель системи в рамках якої функціонує N2O визначаена як обчислювальне середовище, яке складається з процесору подій (N2O), операційного (ETS) та персистентного сховища (KVS). З точки зору обчислювального середовища, ресурси підприємства складаються з глобального сховища та обчислень, які розділяють глобальну адресацію та представляють собою Erlang-процеси (N2O протоколи). Кожен процес PI, може містити певний набір протоколів, будь-який з яких відповідає на певний набір повідомлень. Протоколи N2O визначені на точці підключення повинні не перетинатиcя, в іншому випадку протокольні модулі можуть перехоплювати та впливати на інші протокольні модулі, які повинні реагувати на той самий тип повідомлень.

Обчислювальні ресурси N2O, та асинхронні процеси PI

Усі асинхронні процеси PI запускаються під головним супервізором n2o та індексуються URI ключем разом з типом реактивного каналу реального часу: ws або mqtt. N2O протоколи підключені безпосередньо до веб-сокет точок підключення виконуються в контексті TCP процесів, у даному випадку TCP-сервера бібліотеки RANCH, супервізор ranch_sup.

> :supervisor.which_children :n2o [ { {:ws, '/chat/ws/4'}, <0.985.0>, :worker, [:n2o_ws] }, { {:ws, '/chat/ws/3'}, <0.984.0>, :worker, [:n2o_ws] }, { {:ws, '/chat/ws/2'}, <0.983.0>, :worker, [:n2o_ws] }, { {:ws, '/chat/ws/1'}, <0.982.0>, :worker, [:n2o_ws] }, { {:mqtt, '/bpe/mqtt/4'}, <0.977.0>, :worker, [:n2o_mqtt] }, { {:mqtt, '/bpe/mqtt/3'}, <0.976.0>, :worker, [:n2o_mqtt] }, { {:mqtt, '/bpe/mqtt/2'}, <0.975.0>, :worker, [:n2o_mqtt] }, { {:mqtt, '/bpe/mqtt/1'}, <0.974.0>, :worker, [:n2o_mqtt] }, { {:caching, 'timer'}, <0.969.0>, :worker, [:n2o] } ]

Персистентні ресурси KVS

Для відображення усіх таблиць (префіксів) які існують в глобальному просторі ключів, скористайтеся системним фідом writer.

> :kvs.all :writer [ {:writer, '/bpe/proc', 2, [], [], []}, {:writer, '/erp/group', 1, [], [], []}, {:writer, '/erp/partners', 7, [], [], []}, {:writer, '/acc/synrc/Kyiv', 3, [], [], []}, {:writer, '/chat/5HT', 1, [], [], []}, {:writer, '/bpe/hist/1562187187807717000', 16, [], [], []}, {:writer, '/bpe/hist/1562192587632329000', 1, [], [], []} ]

ЕРЛАНГ ТА СУЧАСНИЙ ВЕБ

Erlang реалізує недосяжну мрію кожного обчислювального середовища для паралельної та узгодженої конкуретної обробки повідоблень. Так найбільш відомі бібліотеки акторів (Akka, Orleans), які реалізують основні примітиви: процесори та черги, копіюють модель акторів Erlang, зазвичай намагаються також реалізують додатково механізми перезапуску та супервізії процесів подібно до Erlang, проте тільки Erlang забезпечує soft real-time характеристики, завдяки керуванню латенсі з точністю до таймінгу команд віртуальної машини. А з виходом 24 версії в 2020 році, яка почала підтримувати JIT-компіляцію завдяки asmjit, продуктивність та чуттєвість віртуальної машини зрозла ще більше.

З формальної точки зору достатньо добре ізольоване середовище віртуальної машини Erlang не тільки забезпечує характерстики реального часу для SMP-планувальника легких зелених процесів, але і обмежує область видимості heap пам'яті виключно для процесів-власників, що унеможливлює вплив відмови певних процесів на глобальний стан віртуальної машини.

Erlang ідеально підходить для побудови високо-навантажених, просто-масштабованих, подійно-орієнтованих, неблокуючих, надійних, постійно-доступних, високо-ефективних, швидких, безпечних та надійних систем обробки повідомлень та розподілених у просторі та часі систем.

DSL VS ШАБЛОНИ

З технічної точки зору N2O успішно показує неперевершену досі якість DSL програмування, яку ви не зможете знайти в сучасних веб-фреймворках для мов Erlang та Elixir. За 7 років неперервної еволюції N2O ми переписали кожен з 700 рядків по 30 разів, якшо порахувати через коміти Github. Веб-фреймворк NITRO, сховище KVS, та BERT.JS кодування може забезпечити відображення в веб-браузері повноекранних вертикальних форм з усіма обчислюваними полями зі швидкістю 60 форм в секунду по веб-сокет каналу. А надзвичайно компакта JavaScript бібліотека-компаньйон вміщується в 4 MSS/MTU вікна — саме такий розмір мінімального веб-клієнта з BERT кодуванням, який повністю управляється зі сторони сервера.

N2O сервер та веб-фреймворк NITRO реалізують концепцію не тільки управління сесіями та каналами, але і усім стеком побудови додатків включаючи UI частину, як це відбувається у таких веб-фреймворках як Erlang Nitrogen, OCaml Ocsigen, Scala Lift, F# WebSharper, а завдяки таким розширенням як FORM та BPE ідеально підходять і для побудови автоматизованих CRM систем.

Це не означає, що за допомогою N2O ви не можете створювати більш класичні та архаїчні додатки у стилі DTL шаблонізаторів, або як це відбувається у таких фреймворках як PHP, ASP, JSP, Rails, тощо. Перші версії NITRO містили в прикладах використання Django Template Library (DTL), проте задля чистоти стеку були прийнято не включати в N2O додаткові шаблонізатори крім NITRO DSL.

КЛІЄНТ

ECMAScript клієнтська інфраструктура для усіх рівнів N2O специфікації.

  • UTF-8.JS — UTF-8 серіалізація
  • IEEE-754.JS — Бінарний формат представлення дійсних чисел
  • ZLIB.JS — ZLIB декомпресія термів
  • ETF.JS — Erlang Term Format серіалізатор
  • N2O.JS — N2O/WebSocket JavaScript протокольний цикл
  • MQ.JS — N2O/MQTT JavaScript протокольний цикл
  • NITRO.JS — NITRO/JavaScript біндінги для DOM джерел
  • VALIDATION.JS — NITRO/JavaScript валідація DOM джерел

ІНШІ МОВИ ПРОГРАМУВАННЯ

N2O TEX — це формальна філософія та інженерна вправа водночас. Вона обмежує автора бути ефективним та точним не втрачаючи при цьому повноти та функціональності. Це накшталт внутрішньої дисципліні при проектуванні програмного забезпечення. Ця філософія більше 8 років застосовується на практиці для побудови систем SYNRC, та визначає стандартний мінімальний набір для демонстрації однієї з сучасних моделей реактивного веб-програмування, яка включає: веб-сокет веб-фреймвок з бінарною серілізацією, пушами та контролем DOM елементів зі сторони сервера. N2O вчить будувати прості та надійні системи на будь-якій мові програмування. Авторські імплементації N2O TEX для функціональних мов програмування:

Мови програмування розділені на чотири рівня як для клієнтської (мобільної та веб розробки) так і для серверної розробки (бекенд системи). Нульовий рівень — тотальні формальні алгебраїчні мови програмування, що забезбечують повноту, функціональність та доведення властивостей прогрм згідно сучасних уявлень про математичне моделювання та системи залежних типів побудованих на розшаруваннях. Перший рівень — формальні функціональні мови програмування, як правило System F, System Fω які успішно використовуються в промисловості та забезпечують достатньо формальний запис який піддається масштабуванню у великих командах завдяки потужному ядру компіляторів. Другий рівень — неформальні (без формальної операційної чи денотаційної семантики) чи формальних верифікаторів, які проте успішно використовуються в промисловості, можуть бути як з розвиненими системами типів з узагальненими шаблонами та типами сумами, так і однотипними мовами програмування з динамічною типізацією. Третій рівень — мови які погано піддаються масштабуванню у промисловому виробництві (на основі спостережень за власним досвідом).

  • Client Tier 3:(JavaScript、Lua)
  • Client Tier 2:(Swift、Kotlin、TypeScript)
  • Client Tier 1:(UrWeb、OCaml、PureScript)
  • Client Tier 0:(Formality)
  • Server Tier 3:(PHP、Python、Perl、Ruby)
  • Server Tier 2:(Erlang、Elixir)
  • Server Tier 1:(Standard ML、Haskell、F#、Rust)
  • Server Tier 0:(Coq、Agda、Lean)

Філософія N2O визначає структуру операційних середовищ (runtimes) як операційну систему лямбда-інтерпретаторів які працюють на паралельному обчислювальному середовищі (ядрах процесорів). Кожне з ядер процесорів виконує в нескінченному циклі команди лямбда-інтерпретаторів, переключаючи через певний проміжок часу на потік команд іншого інтерпретатора. Таке визначення дає змогу вбудувати цю структуру у віртуальну машину Erlang.

  • Головний процес додатку
  • Супервізор додатку
  • Проміжні супервізори
  • Кінцеві пул процесорів повідомлень

ПОРАДА

Кожна мова, на якій реалізовано N2O ТЕХ, має вбудовувати свою філософію максимально природно та компактно. Якщо потрібен якийсь шар між базовою бібліотекою мови, його можна надати, але, якщо можливо, його слід зменшити до нуля. У деяких випадках деякі частини базової бібліотеки можна замінити кращим аналогом. N2O має надати клієнтську бібліотеку-компаньйон, зазвичай реалізовану на іншому наборі мов клієнта: JavaScript, Swift, Kotlin. Якщо ви все зробили правильно, значення N2O не повинно перевищувати 500 LOC на будь-якій мові.