Source
Продуктивність | Тарас Лукавий | Convex довели, шо він не обгортка над Postgres: зібрали схожу базу з J...
578 Views/Reach
2026-10-09 21:57
Message №2502
Convex довели, шо він не обгортка над Postgres: зібрали схожу базу з JSON-файлу
Для: розробників, які обирають бекенд
TL;DR: транзакції, індекси й підписки Convex робить сам. Реляційна база під ним лише зберігає дані. Так пояснюють у 38-хвилинному розборі на офіційному каналі Convex.
А нашо таке відео?
Ведучий каже, шо досі бачить у Discord і X питання «Is Convex just a Postgres wrapper?». Тому замість відповіді текстом вони крок за кроком будують іграшкову базу з тими самими властивостями. Старт - порожній JSON-файл, далі лагодять кожну проблему по черзі.
Шо там будують
1. Append-only лог: середину файлу не редагують, а дописують у кінець. Актуальне значення - найнижче.
2. Транзакції: якщо світло вимкнеться між «зменшили залишок на складі» і «поклали капелюх у кошик», дані не мають розлізтись. Або обидві зміни, або жодної.
3. Два юзери бачать stock=1 і обидва купують. Рішення: транзакція пам'ятає, шо прочитала (read set) і шо хоче записати (write set). Committer перед записом перевіряє, чи прочитане не змінилось. Змінилось - мутація перезапускається.
4. Таймстемпи: без них committer не відрізнить «значення не мінялось» від «було 1, стало 2, знов 1».
5. Версійовані індекси, шоб мутація, яка стартувала раніше, читала базу на момент свого старту.
6. Підписки: запит - це мутація без write set. Коли новий коміт зачіпає read set відкритого запиту, той перезапускається, і клієнт отримує свіжі дані. Звідси реактивність Convex.
А де підводні камені?
Повтор мутації безпечний, лише якщо вона детермінована і без побічних ефектів. Інакше повторний виклик типу chargeCard() спише гроші двічі. Тому все зовнішнє, типу Stripe, виносять в actions. А scheduler пише в той самий write set: коміт відхилили - нічого не заплановано.
Нюанс: це розбір від самої компанії. Тезу «Postgres за замовчуванням на READ COMMITTED з аномаліями, а в нас усе serializable» Convex пише у своєму блозі. SERIALIZABLE у Postgres теж є, просто не за замовчуванням.
Ті самі демо є в інтерактивній статті: explained.convex.dev/build-your-own-convex
https://youtu.be/2jGiVHdQUkE
Для: розробників, які обирають бекенд
TL;DR: транзакції, індекси й підписки Convex робить сам. Реляційна база під ним лише зберігає дані. Так пояснюють у 38-хвилинному розборі на офіційному каналі Convex.
А нашо таке відео?
Ведучий каже, шо досі бачить у Discord і X питання «Is Convex just a Postgres wrapper?». Тому замість відповіді текстом вони крок за кроком будують іграшкову базу з тими самими властивостями. Старт - порожній JSON-файл, далі лагодять кожну проблему по черзі.
Шо там будують
1. Append-only лог: середину файлу не редагують, а дописують у кінець. Актуальне значення - найнижче.
2. Транзакції: якщо світло вимкнеться між «зменшили залишок на складі» і «поклали капелюх у кошик», дані не мають розлізтись. Або обидві зміни, або жодної.
3. Два юзери бачать stock=1 і обидва купують. Рішення: транзакція пам'ятає, шо прочитала (read set) і шо хоче записати (write set). Committer перед записом перевіряє, чи прочитане не змінилось. Змінилось - мутація перезапускається.
4. Таймстемпи: без них committer не відрізнить «значення не мінялось» від «було 1, стало 2, знов 1».
5. Версійовані індекси, шоб мутація, яка стартувала раніше, читала базу на момент свого старту.
6. Підписки: запит - це мутація без write set. Коли новий коміт зачіпає read set відкритого запиту, той перезапускається, і клієнт отримує свіжі дані. Звідси реактивність Convex.
А де підводні камені?
Повтор мутації безпечний, лише якщо вона детермінована і без побічних ефектів. Інакше повторний виклик типу chargeCard() спише гроші двічі. Тому все зовнішнє, типу Stripe, виносять в actions. А scheduler пише в той самий write set: коміт відхилили - нічого не заплановано.
Нюанс: це розбір від самої компанії. Тезу «Postgres за замовчуванням на READ COMMITTED з аномаліями, а в нас усе serializable» Convex пише у своєму блозі. SERIALIZABLE у Postgres теж є, просто не за замовчуванням.
Ті самі демо є в інтерактивній статті: explained.convex.dev/build-your-own-convex
https://youtu.be/2jGiVHdQUkE