Проект разделен на два репозитория
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user