Миграция на Turso. Теперь и база на Rust
Я не трогаю то, что работает. Это правило. Сайт летал на обычном SQLite. Всё было стабильно, никаких сбоев. Но у меня в планах чат, регистрация и сообщество. А обычный SQLite умеет писать в базу только по одной штуке за раз. Если десять человек одновременно напишут в чат, они встанут в очередь. Для блога это норм, для чата - смерть.
Поэтому я полез менять базу. Мне посоветовали Turso. Это тот же SQLite, только переписанный на Rust. И у него внутри есть MVCC - штука, которая позволяет писать параллельно, не блокируя друг друга. Плюс куча других ништяков на будущее.
Канешно, я знал, что Turso еще в бете. Что API может поменяться, что могут вылезти баги. Поэтому перед тем как что-то менять, я сделал коммит-чекпоинт. Если бы всё сломалось, я бы просто откатил код одной командой и забыл как страшный сон. Без паники.
И слава богу, что сделал. Потому что граблей я собрал вагон.
Затык номер раз: поиск.
У меня в проекте был полнотекстовый поиск на встроенной фиче SQLite под названием FTS5. Лезу в Turso, а он мне говорит: «No such module: fts5». То есть, мы это не поддерживаем и не будем. Пришлось прикручивать Tantivy - это движок для поиска на Rust, типа местного Люцена. Поиск стал работать по-другому, но даже лучше. Он теперь умеет ранжировать результаты по релевантности.
Затык номер два: кириллица.
Но поиск заработал только на английском. Пишу «карт», он выдает ноль результатов. Пишу «leptos», всё находит. Оказалось, стандартный токенизатор в Tantivy не понимает русские буквы. Пришлось включать специальный режим ngram и принудительно переводить всё в нижний регистр. Заработало. Правда, была побочка: заголовки постов в выдаче стали строчными буквами. Пришлось выкручиваться, брать оригинальный заголовок из кэша.
Затык номер три: админка.
У меня же админка на WebAssembly (WASM) работает в браузере. А Turso тянет за собой нативные библиотеки на C. И когда сборщик попытался собрать это под браузер, он просто встал и сказал: «А где мне взять компилятор C?». Пришлось переписывать конфиг, чтобы Turso подключался только на сервере. Админке он всё равно напрямую не нужен, она через сеть ходит.
Были еще мелочи вроде лишнего ORDER BY в коде, из-за которого поиск молчал целый час. Я сам его сломал, сам и починил.
Что в итоге.
База переехала. Теперь я могу писать в нее параллельно, и она не будет чахнуть от этого. Векторный поиск для будущего чата тоже на месте, как и встроенное шифрование данных на диске.
Да, бинарник проекта потолстел с 20 до 38 мегабайт. Да, сборка теперь занимает не 3 минуты, а целых 7. Но сайт всё так же мгновенно отдается сервером. Бенчмарки не просели ни на балл.
Зачем я это сделал.
Я строю не просто блог. Я строю полигон. И когда сюда придет чат, регистрация, каталог и аналитика - обычный SQLite просто ляжет под нагрузкой. Turso дает мне задел на будущее. Уведомления в реальном времени, реплики для чтения и шифрование, о котором я говорил в посте про приватность.
Turso - это не серебряная пуля. Он сыроват, и я это принял. Но для проекта, который растет в сторону сообщества, этот шаг прийдется сделать рано или поздно. Я сделал его рано.