- Реализовать
geojson
базу данных с журналом записи транзакций и снапшотом состояния - Добавить первичный индекс по полю
ID
- Добавить вторичный
spatial
индекс по полюGeometry
Добавить в конструктор сервиса параметр для имени сервиса
NewStorage(addr string, wrkdir string, name string)
Движком хранения и обработки данных является горутина:
Engine
Горутина Engine
отвечает за in-memory
хранение данных:
- создание и сохранение транзакции в файл журнал
- меняет эти данные
- индексирует данные
- возвращает данные по запросу
- сохраняет данные в файл чекпоинт
Горутина Engine
при запуске должна прочитать чекпоинт файл с данными затем должна прочитать файл с журналом транзакций.
Горутина должны завершаться в вызове Stop
структуры Storage
.
Для взаимодействия с горутиной использовать каналы.
Для управления горутиной использовать context.Context
.
- Индексы неперсистентные и не больше, чем оперативная память
- Для индексов использовать готовые решения:
- Первичный
map[string]any
- Spatial, например https://github.com/tidwall/rtree
- Первичный
LSN — log sequence number. Локальный счетчик транзакций. LSN + name — уникальный идентификатор транзакции.
Транзакция сериализуется в структуру Transaction
:
action :string
- значения
insert
replace
delete
- значения
name :string
- значение
name
в сервисе
- значение
lsn :uint64
- постоянно возрастающий локальный счетчик
feature :any
- значения из стандарта
https://geojson.org
- значения из стандарта
Горутина Engine
должна обеспечить консистентное сохранения данных в файл чекпоинт.
Файл чекпоинт должен представлять из себя как бы журнал insert
транзакций.
После checkpoint
процедуру журнал транзакций можно очистить.
POST /checkpoint
- запускает
checkpoint
продедуру в горутинеEngine
- запускает