qrrot — база данных со встроенным ИИ
piterovxyz 15 минут назад qrrot — база данных со встроенным ИИ Средний 5 мин 725 Go * Из песочницы Так выглядит работа с AIНаписать свою in-memory базу данных — это своеобразный способ изучить Go под капотом и сделать...
В сфере искусственного интеллекта произошло заметное событие. piterovxyz 15 минут назад qrrot — база данных со встроенным ИИ Средний 5 мин 725 Go * Из песочницы Так выглядит работа с AIНаписать свою in-memory базу данных — это своеобразный способ изучить Go под капотом и сделать значимый пет-проект. Создавать обычную обертку над map скучно. Поэтому я задался вопросом: а что если написать по настоящему быстрый движок с бинарным хранением, а сверху прикрутить интерактивного ИИ-ассистента, с которым можно общаться на естественном языке, заставляя его самостоятельно выполнять цепочки запросов?
Так на свет появился qrrot — in-memory хранилище на Go с TCP-интерфейсом, бинарными снапшотами и встроенным агентом на базе Gemini. В этой статье я проведу максимально подробный обзор своего проекта: мы разберем архитектуру, посмотрим на бенчмарки, изучим, как тут работает ИИ, а в конце я пройдусь по всем архитектурным болячкам и недочетам. Под капотом: Типы данных и движокВ ядре qrrot лежит потокобезопасная структура Store, защищенная sync.
Технические детали
RWMutex:type Store В отличие от примитивных хранилищ типа string-string, движок строго типизирован и поддерживает три классических типа данных:string — классические строки;int — 64-битные целые числа;json — JSON-объекты. Все значения хранятся в памяти в структуре Value, которая содержит байтовый слайс и тег типа:type Type uint8 const ( TypeEmpty Type = iota TypeString TypeInt TypeJson ) type Value Это позволяет легко сериализовать данные и избегать расходов на рефлексию при отдаче клиенту. Команды максимально привычные: put, get, del, exists, incr, decr, all.
Борьба за наносекунды: Парсер и сетевой слойКогда вы пишете базу данных, самое «горячее» место — это разбор входящих команд. Split здесь не подойдет: он аллоцирует память на каждый токен, что убьет производительность сборщика мусора при десятках тысяч запросов в секунду. Zero-alloc (почти) парсерЯ написал парсер, который бежит по массиву байт, игнорируя лишние пробелы и табуляции.
Особая магия начинается при обработке строк с пробелами (например, JSON-объектов). Парсер умеет понимать двойные кавычки " и экранированные символы \", аккуратно собирая токены в предвыделенный буфер byte. Результаты бенчмарков (Apple M4, Darwin ARM64) говорят сами за себя:Сырые операции в памяти: BenchmarkStore_Get - 6.
Отраслевые последствия
29 ns/op, 0 B/op, 0 allocs/opBenchmarkStore_Put -13. 30 ns/op, 0 B/op, 0 allocs/opПарсинг команд: BenchmarkParser_ParseGet - 25. 70 ns/op, 32 B/op, 1 allocs/opBenchmarkParser_ParsePut -51.
19 ns/op, 32 B/op, 2 allocs/opАллокации в парсере сведены к минимуму (1-2 на команду) — они уходят лишь на приведение байтов к string при создании объекта команды. TCP-серверСетевое взаимодействие построено на базе стандартного пакета net. Каждое соединение обслуживается в своей горутине.
Полный цикл (получение пакета -> парсинг -> блокировка мьютекса -> чтение/запись -> ответ клиенту) работает крайне быстро:BenchmarkTCPServer_Get - 11 970 ns/op (~83 000 RPS)BenchmarkTCPServer_Put - 12 157 ns/op (~82 000 RPS)3.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





