feat: rate limiting, shared DB instance, TCP_NODELAY fix

- Add rate limiter to TCP and HTTP servers
- Share single LSMTree between TCP and HTTP servers
- Replace unsafe cast[string]/cast[seq[byte]] with safe helpers
- Stabilize gossip UDP socket with exponential backoff
- Fix TCP_NODELAY via low-level setSockOptInt(IPPROTO_TCP)
  (asyncnet.setSockOpt(OptNoDelay) uses SOL_SOCKET and fails)
- Apply TCP_NODELAY to server and websocket sockets
This commit is contained in:
2026-05-18 19:33:40 +03:00
parent 7e6a45e6b7
commit 8afa998516
13 changed files with 240 additions and 47 deletions
+23 -2
View File
@@ -34,10 +34,31 @@ BaraDB е **мултимодален database engine**, написан на Nim,
- **WebSocket** (`core/websocket.nim`): Full-duplex стрийминг
- **Embedded** (`storage/lsm.nim`): Директен in-process достъп
### Сървърна Архитектура
TCP и HTTP сървърите споделят един LSMTree инстанс за гарантиране на консистентност на данните:
```
┌─────────────────────────────────────────────────────────┐
│ СПОДЕЛЕНО СЪХРАНЕНИЕ │
│ LSMTree Инстанс │
├────────────────────────┬────────────────────────────────┤
│ TCP Сървър │ HTTP Сървър │
│ (Бинарен Протокол) │ (REST API) │
│ Порт: 9472 │ Порт: 9912 │
│ TCP_NODELAY: ВКЛ │ Multi-threaded │
└────────────────────────┴────────────────────────────────┘
```
**Ключови оптимизации:**
- **Споделен LSMTree** — И двата сървъра работят върху един и същ database инстанс, елиминирайки несъответствие в данните
- **TCP_NODELAY** — Включен както на слушащия, така и на клиентските сокети за по-ниска латентност при малки съобщения
- **Безопасна конверсия на байтове** — Правилни `bytesToString`/`stringToBytes` функции вместо unsafe `cast` операции
### Управление на Връзки
- **Connection Pool** (`protocol/pool.nim`): Min/max лимити на връзки с idle timeout
- **Rate Limiting** (`protocol/ratelimit.nim`): Token-bucket глобални и per-client лимити
- **Rate Limiting** (`protocol/ratelimit.nim`): Token-bucket глобални и per-client лимити, интегрирани в TCP и HTTP хендърите
- **Автентикация** (`protocol/auth.nim`): JWT с HMAC-SHA256 и достъп на база роли
- **TLS/SSL** (`protocol/ssl.nim`): TLS 1.3 с автоматично генерирани сертификати
@@ -95,7 +116,7 @@ BaraQL конвейрът:
- **Raft Консенсус** (`core/raft.nim`): Leader election, log репликация
- **Шардиране** (`core/sharding.nim`): Hash, range и consistent hashing
- **Репликация** (`core/replication.nim`): Sync, async, semi-sync режими
- **Gossip Протокол** (`core/gossip.nim`): SWIM-подобно управление на членство
- **Gossip Протокол** (`core/gossip.nim`): SWIM-подобно управление на членство с експоненциален backoff при грешки
- **Разпределени Транзакции** (`core/disttxn.nim`): Two-phase commit
## Ключови Дизайнерски Решения
+15
View File
@@ -2,6 +2,21 @@
Всички забележителни промени в BaraDB са документирани в този файл.
## [Unreleased] — Подобрения на Сървърната Архитектура
### Поправки
- **Споделен Storage Инстанс** — TCP и HTTP сървърите вече споделят един LSMTree инстанс вместо да създават отделни, елиминирайки несъответствие в данните между протоколите
- **Unsafe Cast Операции** — Заменени са всички `cast[string]` и `cast[seq[byte]]` с безопасните `bytesToString`/`stringToBytes` помощни функции, които правилно копират данните за съвместимост с ARC/ORC управлението на паметта
### Промени
- **TCP_NODELAY Включен** — Както слушащите, така и клиентските сокети вече имат TCP_NODELAY, намалявайки латентността за малки съобщения (заявки, acks) чрез деактивиране на алгоритъма на Nagle
- **Rate Limiter Интегриран** — Token-bucket rate limiter вече е активен в TCP и HTTP сървър хендърите:
- TCP: Per-client rate limiting на query съобщения (код за грешка 429)
- HTTP: Rate limiting на `/query` и `/batch` endpoints с поддръжка на `X-Forwarded-For`
- **Gossip Обработка на Грешки** — Подобрено възстановяване при UDP socket грешки с експоненциален backoff (100ms-5s) и презаписване на сокета само след 10 последователни грешки
## [Unreleased] — SQL:2023 Стабилизация
### Поправки
+4 -2
View File
@@ -45,8 +45,10 @@ BaraDB може да се конфигурира чрез **променливи
|------------|----------|----------|
| `BARADB_AUTH_ENABLED` | `false` | Включване на автентикация |
| `BARADB_JWT_SECRET` | — | JWT подписващ secret |
| `BARADB_RATE_LIMIT_GLOBAL` | `10000` | Глобални заявки в секунда |
| `BARADB_RATE_LIMIT_PER_CLIENT` | `1000` | Заявки в секунда за клиент |
| `BARADB_RATE_LIMIT_GLOBAL` | `10000` | Глобални заявки в минута (token-bucket) |
| `BARADB_RATE_LIMIT_PER_CLIENT` | `1000` | Заявки в минута за клиент (token-bucket) |
> **Забележка:** Rate limiting се прилага на ниво протокол и в двата сървъра (TCP и HTTP). TCP използва ID на връзката за per-client лимити. HTTP използва `X-Forwarded-For` хедър (за прокси среди) или глобален ключ.
### Логване
+17
View File
@@ -11,6 +11,11 @@ BaraDB поддържа множество протоколи за клиент
Бинарният протокол използва big-endian кодиране за всички многобайтови стойности.
### Оптимизации на Връзката
- **TCP_NODELAY** — Включен както на сървърните, така и на клиентските сокети за минимизиране на латентността при малки съобщения (заявки, acks). Това деактивира алгоритъма на Nagle, гарантирайки че пакетите се изпращат незабавно без буфериране.
- **Rate Limiting** — Token-bucket rate limiter е интегриран на ниво протокол. Заявки надвишаващи лимита получават код за грешка 429.
### Жизнен Цикъл на Връзката
```
@@ -107,6 +112,18 @@ BaraDB поддържа множество протоколи за клиент
Базов URL: `http://localhost:9470/api/v1`
### Rate Limiting
Всички query endpoints (`/query`, `/batch`) са защитени от token-bucket rate limiter:
- **Глобален лимит** — Конфигурира се чрез `BARADB_RATE_LIMIT_GLOBAL` (по подразбиране: 10,000 заявки/минута)
- **Per-client лимит** — Конфигурира се чрез `BARADB_RATE_LIMIT_PER_CLIENT` (по подразбиране: 1,000 заявки/минута)
- **Идентификация на клиент** — Използва `X-Forwarded-For` хедър когато е зад прокси, иначе използва глобален ключ
При rate limiting, сървърът връща HTTP 429 с:
```json
{"error": "Rate limit exceeded"}
```
### Endpoints
#### Health