Files

108 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# module-04-vm2. Redis Safety ВМ2 Processing
> Статус: целевая спецификация Redis на ВМ2.
> Канонический контракт (ключи, TTL, Lua, AOF, ACL, eviction) — [`arch-09-redis.md`](../../architectory/arch-09-redis.md).
> Redis DB0/DB1 ВМ1 — [`module-04-redis-vm1.md`](../../VM1_app/documentation/module-04-redis-vm1.md). Hostname Redis ВМ1 не используется.
## 1. Назначение и границы
Отдельный instance Redis Safety: hot cache, rate limiting caller и optional worker wake-up. PostgreSQL `message_safety.safety_tasks` — единственный queue/lease source (`FOR UPDATE SKIP LOCKED`, fencing generation). Redis не хранит authoritative task state, locks или leases.
`bitrix-sync` этот Redis не использует. Guest API rate/idempotency/realtime — на ВМ1.
Cache loss/restart безопасно восстанавливается из PostgreSQL; Redis outage не выключает core Safety.
## 2. URL и ACL
```text
MESSAGE_SAFETY_REDIS_URL=redis://message_safety:<secret>@redis:6379/0
```
Только на ВМ2. Credential доставляется secret file и не входит в общий `.env` ВМ1. `message_safety` ACL: только prefixes `han:safety:*`. `REDIS_URL` / `REDIS_REALTIME_URL` на ВМ2 отсутствуют.
Logical DB index `/0` — локальный этой instance, не DB0 ВМ1.
## 3. Карта ключей
| Key | Тип/value | TTL |
|---|---|---|
| `han:safety:rl:service:{caller}:{window}` | counter | window+jitter |
| `han:safety:text:{analysis_hash}:{rules_version}` | hot text-rules result, monitor rule ids без raw text | active config, seed ≤48h |
| `han:safety:verdict:{content_hash}:{config_version}:{detector_bundle}` | hot file verdict cache | active config, seed ≤30d |
| `han:safety:link:{url_hash}:{rules_version}:{config_version}` | stable local policy cache | active config, seed ≤48h |
| `han:safety:dns:{host_hash}:{rrtype}` | DNS answer; classification повторяется под текущей policy | actual TTL, active hard max seed 900s |
| `han:safety:wakeup` | Pub/Sub notification only | no storage |
Raw message text, file bytes, presigned URL и task/lease documents запрещены.
Legacy v1 stub DB2 живёт на ВМ1 и **не** создаётся на ВМ2.
## 4. Lua scripts ВМ2
Обязательные:
- rate-limit evaluate для `han:safety:rl:*`;
- при необходимости — atomic cache set с TTL/version stamp.
Lua `safety task get+increment poll` на ВМ2 **запрещён**: poll/lease принадлежат PostgreSQL. `NOSCRIPT` reload — arch-09 §6.
## 5. Sizing ВМ2
```text
Redis Safety = hot verdict/link/DNS entries + rate windows + Pub/Sub buffers
total × 1.5 allocator/fragmentation × 1.3 growth reserve
```
Volume `redis-data` rebuildable: бизнес-restore из dump не требуется.
## 6. Degraded behavior ВМ2
При Redis недоступен:
- production Safety продолжает task claim/poll через PostgreSQL;
- hot cache/rate/wakeup деградируют и прогреваются после восстановления;
- Redis hot cache не является core gate `/health/ready` (capability map module-05 / arch-03);
- `bitrix-sync` не деградирует из-за этого Redis.
Restore: поднять пустой или проверенный instance; Safety прогревает cache лениво. Не копировать dump в небезопасное место.
## 7. Metrics ВМ2
Общие — arch-09 §14 и [`module-09-observability-vm2.md`](module-09-observability-vm2.md). Дополнительно: Safety hot-cache hit/miss, DNS TTL cap, wakeup subscribers, rate-limit decisions caller.
## 8. Тесты ВМ2
- ACL: `message_safety` видит только `han:safety:*`; `han:api:*` / `han:rt:*` недоступны;
- порт 6379 недоступен с host/public network и с ВМ1 Docker DNS;
- Safety cache loss/rebuild, DNS TTL cap и доказательство отсутствия task/lease state в Redis;
- rate Lua concurrency;
- `NOSCRIPT` reload;
- all application keys имеют TTL (кроме Pub/Sub channel);
- max value/invalid serialization; raw text/file не сохраняются;
- restart with AOF/RDB, corrupted AOF rehearsal, empty restore;
- Redis outage не останавливает PostgreSQL claim/poll;
- logs/metrics не содержат secret/value/PII/message text.
## 9. Definition of Done ВМ2
Дополнительно к arch-09 §15:
- prefixes `han:safety:*` реализованы; task/lease keys отсутствуют;
- cache loss/rebuild и DNS TTL cap доказаны;
- health/degraded §6 согласованы с capability readiness Safety;
- dashboards/alerts Redis Safety готовы;
- `MESSAGE_SAFETY_REDIS_URL` не появляется в репозитории/Compose ВМ1.
## 10. TBD ВМ2
- R1/R2: maxmemory и eviction после load profile Safety.
- R4: Safety task TTL/recovery margin — в PostgreSQL / [`module-05-message-safety.md`](module-05-message-safety.md), не в Redis.
- R3: имя `MESSAGE_SAFETY_REDIS_URL` — arch-04.
## 11. Ссылки
- Контракт: [`arch-09-redis.md`](../../architectory/arch-09-redis.md).
- ВМ1: [`module-04-redis-vm1.md`](../../VM1_app/documentation/module-04-redis-vm1.md).
- Указатель: [`module-04-redis.md`](module-04-redis.md).
- Safety: [`module-05-message-safety.md`](module-05-message-safety.md).