docs: документация переведена на канон av-dev-pm
- беклог и план переехали в docs/tasks (38 задач, 11 целей), слаги переименованы с транслита на английские, 85 ссылок поправлены - conventions.md разобран в docs/conventions/, local-research.md — в docs/research/, review-journal.md — в docs/review.md с разделом настройки конвейера; заведены security.md, adr/ и .pm.json - шаг docs.py check добавлен в task gate; поведение в architecture.md помечено девятью маркерами долга, database.md получил настройки с числовым значением
This commit is contained in:
@@ -155,3 +155,35 @@ ROWID` строка целиком, вместе со сжатым `payload`, ж
|
||||
массивов); при равных наборах выигрывает версия из более поздней доставки
|
||||
журнала, а не свёрнутая последней. Подробности и обоснование — в
|
||||
`architecture.md`, раздел «Тренировки и прочие секции».
|
||||
|
||||
## Представление данных
|
||||
|
||||
- **Точки часового объекта лежат сжатым BLOB** (`gzip`) в колонке `payload`.
|
||||
Чтение объекта распаковывает его **целиком**: частичного доступа к точке нет,
|
||||
и любая правка — read-modify-write всей пачки. Отсюда цена широкой доставки:
|
||||
63 МиБ на одной координате держат транзакцию 5.15 с, а тело 40 МиБ давало
|
||||
768 МиБ пика кучи, пока канонизация шла внутри транзакции.
|
||||
- Таблицы часовых объектов — `WITHOUT ROWID`: строка целиком, вместе со сжатым
|
||||
`payload`, живёт в дереве первичного ключа. Поэтому агрегатные запросы идут
|
||||
по покрывающему индексу `bucket_catalog`, а не по таблице.
|
||||
- Тела доставок в базе не лежат вовсе — они в сыром архиве
|
||||
(`<archive_dir>/raw/ГГГГ/ММ/ДД/<ulid>.json.gz`); в `delivery` только учёт.
|
||||
|
||||
## Настройки с числовым значением
|
||||
|
||||
Без них замер не превращается в находку: пик памяти — аномалия только рядом со
|
||||
строкой «запись лежит сжатой и распаковывается целиком».
|
||||
|
||||
| Настройка | Значение | Где задана |
|
||||
| --- | --- | --- |
|
||||
| `journal_mode` | `WAL` | `internal/store/store.go`, строка соединения |
|
||||
| `busy_timeout` | `5000` мс | там же; на устаревший снимок транзакции **не** действует |
|
||||
| `foreign_keys` | `on` | там же |
|
||||
| `journal_size_limit` | 64 МиБ | `internal/store/store.go`, `journalSizeLimit` |
|
||||
| чекпойнт WAL по таймеру | 1 мин | `cmd/healthlog/checkpoint.go`, `checkpointInterval` |
|
||||
| предел тела запроса | 64 МиБ (`ingest.max_body_mb`) | конфиг; **ретроактивен** — тем же пределом читаются тела из архива при пересборке |
|
||||
| таймаут чтения запроса | 5 мин (`server.read_timeout`) | конфиг; щедро: экспорт истории по мобильной сети |
|
||||
| таймаут отправки ответа | 30 с (`server.write_timeout`) | конфиг; маршрут приёма держит собственный бюджет |
|
||||
| бюджет остановки | 30 с | `cmd/healthlog/serve.go`, `shutdownTimeout` |
|
||||
| ретеншен сырого архива | до следующего проверенного экспорта (~2 ГБ за квартал) | правило, а не число; не реализован — задача `raw-archive-retention` |
|
||||
| предела на одну сущность | **нет** | задача `entity-size-limits` |
|
||||
|
||||
Reference in New Issue
Block a user