Skip to content

Instantly share code, notes, and snippets.

@5HT
Created March 1, 2026 05:29
Show Gist options
  • Select an option

  • Save 5HT/310ed0d5f3982fb6d7572fbaa263109b to your computer and use it in GitHub Desktop.

Select an option

Save 5HT/310ed0d5f3982fb6d7572fbaa263109b to your computer and use it in GitHub Desktop.
2026-03-01 KVS.md

Про доречність використання KVS

Про доречність використання KVS в Документообігах, CRM, чатах та телеком системах.

Вступ до KVS

KVS (Key-Value Store) — це легкий клієнтський інтерфейс, побудований на абстракціях баз даних типу B-tree, призначений для простого зберігання та обробки даних в Erlang/OTP-екосистемі. Розроблений компанією Synrc, KVS надає абстрактний, компактний та перевірений на практиці API (близько 500 рядків коду), який підтримує базові операції для систем, таких як леджери, месенджери, системи зберігання та банківські додатки.

KVS підтримує різні бекенди: Mnesia, RocksDB, FS (файлова система), Spandb та інші, що дозволяє гнучко адаптувати його до різних середовищ — від вбудованих систем до високонавантажених серверів. Основні модулі:

  • KVS — для базових операцій з даними (put, get, delete, index, seq, count, dir).
  • KVS Stream — для роботи з ланцюжками даних (feeds), курсорами (writers/readers) та асинхронною обробкою.

Завдяки поліморфним записам (extensible records) та підтримці ланцюжкових структур, KVS ідеально підходить для систем, де дані організовані в послідовності або дерева, забезпечуючи атомарність, стійкість до збоїв та ефективну навігацію.

RocksDB, як ключовий бекенд для KVS, є прямим нащадком LevelDB (розробленого інженерами Google, такими як Jeff Dean та Sanjay Ghemawat), і водночас продовжує традицію класичних вбудованих key-value сховищ, таких як Berkeley DB (відомий також як SleepyCat DB від компанії Sleepy Cat Software, пізніше придбаної Oracle). Ця еволюція робить RocksDB значно кращим за традиційні SQL-бази (наприклад, PostgreSQL) для задач документообігу, де потрібна висока швидкість запису та низька латентність: на відміну від SQL з жорсткими схемами та ACID-транзакціями, які уповільнюють масові вставки, RocksDB використовує LSM-дерева для оптимізації записів на SSD, зменшуючи ампліфікацію запису та забезпечуючи кращу продуктивність у write-intensive сценаріях (наприклад, у MyRocks — форку MySQL на базі RocksDB). Порівняно з іншими NoSQL (як MongoDB чи Cassandra), RocksDB вирізняється нижчим споживанням ресурсів, кращою стабільністю під навантаженням та інтеграцією з існуючими системами, без зайвої складності розподілених кластерів. Навіть проти мультимодельних баз, як InterSystems Caché (яка теж підходить для документообігу з підтримкою KV, relational та document-моделей), RocksDB перевершує в чистій швидкості KV-операцій та простоті вбудовування, уникаючи overhead від мультимодальності; наприклад, тести показують, що RocksDB в 2-5 разів швидший у write-бенчмарках, ніж InnoDB чи подібні двигуни. До того ж, Google сам побудував свої ранні системи (включно з елементами BigTable, натхненними key-value підходами) на ідеях, подібних до Berkeley DB, що підкреслює надійність цієї лінії розвитку для масштабних даних.

Огляд API KVS

Модуль KVS

  • put/1: Зберігає запис, використовуючи ID як ключ.
  • get/2: Отримує запис за ключем з таблиці.
  • delete/2: Видаляє запис.
  • index/3: Шукає записи за полем та значенням (потребує індексації і працює тільки в RDBMS).
  • seq/2: Генерує новий ID для таблиці (атомарний лічильник).
  • count/1: Підраховує кількість записів у таблиці.
  • dir/0: Повертає список таблиць.

Бекенд налаштовується через application env, наприклад, у sys.config: {dba, store_rocks} для RocksDB. Це забезпечує високу продуктивність навіть під великим навантаженням.

Модуль KVS Stream

  • writer/1 та reader/1: Створюють курсори для запису/читання ланцюжків.
  • save/1 та load_reader/1: Зберігають/завантажують курсори.
  • add/1 та append/2: Додають елементи до ланцюжка.
  • next/1, prev/1, top/1, bot/1: Навігація по ланцюжку.
  • take/1 та drop/1: Витягають/пропускають N елементів.
  • remove/2 та cut/2: Видаляють елементи або очищають ланцюжок до ключа.

Ці функції дозволяють створювати стійкі до збоїв потоки даних, де курсори зберігають стан для асинхронної обробки.

Чому KVS доречний для конкретних систем

Документообіги (Workflow Systems)

У системах документообігу KVS ефективно управляє ланцюжками документів: кожен документ — це запис у ланцюжку, де add/1 додає новий етап (наприклад, підпис, рецензування), а курсори (readers) дозволяють відстежувати статус асинхронно. Поліморфні записи підтримують розширювані метадані (наприклад, автор, версія, attachments). З RocksDB як бекендом, KVS забезпечує швидкий пошук за індексами (index/3), що критично для великих обсягів документів. Перевага: атомарні операції (seq/2) генерують унікальні ID, запобігаючи дублюванням у розподілених системах.

CRM-системи

У CRM KVS моделює історії взаємодій з клієнтами як ланцюжки подій (feeds): дзвінки, email, угоди. Функції append/2 додають нові записи, а take/1 дозволяє асинхронно витягувати непрочитані події для менеджерів. Курсори зберігають позицію користувача (save/1), забезпечуючи персоналізований доступ. З підтримкою множинних бекендів, KVS масштабується від локальних баз до хмарних (наприклад, RocksDB для високого навантаження). Перевага: ефективна індексація за полями (наприклад, за клієнтським ID) робить запити швидкими, а поліморфні структури дозволяють додавати кастомні поля без зміни схеми.

Чати та месенджери

KVS Stream ідеальний для чатів: ланцюжки повідомлень — це feeds, де writer/1 створює курсор для додавання (add/1), а reader/1 — для читання з курсором для непрочитаних повідомлень. Функції next/1 та prev/1 дозволяють пагінацію та навігацію, а take/1 — асинхронне завантаження пакетами. Підтримка FIFO-черги робить KVS придатним для групових чатів або приватних каналів. Перевага: стійкість до збоїв — курсори зберігаються в БД, тож при перезапуску користувач продовжує з останньої позиції. Приклад: у реальному часі обробка тисяч повідомлень без втрат.

Черги з курсорами для асинхронної обробки

KVS підтримує черги (queues) як ланцюжки з курсорами: writer додає завдання (append/2), reader споживає їх асинхронно (take/1 або drop/1 для пропуску). Це FIFO-структура з bidirectional навігацією, ідеальна для таск-менеджерів або бекграунд-джобів. Асинхронність забезпечується збереженням стану курсорів (save/1), що дозволяє обробляти дані в паралельних процесах Erlang. Перевага: з RocksDB, KVS витримує високе навантаження без блокувань, а cut/2 очищає оброблені елементи для оптимізації пам'яті.Довільні фіди (Arbitrary Feeds)Для фідів (наприклад, стрічки новин, логів подій) KVS використовує ланцюжкову persistence: add/1 додає елементи, top/1 та bot/1 встановлюють напрямок читання. Це дозволяє створювати публічні/приватні фіди з ефективною пагінацією. Перевага: поліморфні записи підтримують будь-які дані (текст, медіа, метрики), а бекенди забезпечують масштабованість для мільйонів записів.

  • Інтермідіарі леджери: Ланцюжки транзакцій як immutable feeds; append/2 додає блоки, prev/1 — для верифікації історії. Підтримка RocksDB забезпечує швидкий доступ до історичних даних.
  • Системи логування та моніторингу: Зберігання часових рядів (time-series) як ланцюжків; index/3 для пошуку за timestamp, take/1 — для витягування логів за період. Ідеально для DevOps-інструментів.
  • Банківські додатки: Управління транзакціями як чергами; атомарні ID (seq/2) запобігають дублюванням платежів, а курсори дозволяють асинхронну обробку (наприклад, підтвердження в бекграунді).
  • Ігрові системи: Фіди подій гравців (scores, achievements); writer/reader для реального часу оновлень у мультиплеєрі.
  • IoT-платформи: Обробка потоків даних від сенсорів як feeds; асинхронна навігація курсорами для аналізу в реальному часі.
  • Контент-менеджмент (CMS): Ланцюжки версій контенту; cut/2 для очищення старих ревізій, index/3 для пошуку за тегами.
  • Соціальні мережі: Персоналізовані фіди постів; підтримка множинних курсорів для різних користувачів.

KVS виділяється своєю простотою, гнучкістю та інтеграцією з Erlang, роблячи його потужним інструментом для розподілених систем. Для детальнішої інформації зверніться до документації на kvs.n2o.dev. Якщо ви розробник, спробуйте інтегрувати KVS у свій проєкт — його компактність полегшить масштабування!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment