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:
+23
-2
@@ -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
|
||||
|
||||
## Ключови Дизайнерски Решения
|
||||
|
||||
@@ -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 Стабилизация
|
||||
|
||||
### Поправки
|
||||
|
||||
@@ -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` хедър (за прокси среди) или глобален ключ.
|
||||
|
||||
### Логване
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+23
-2
@@ -34,10 +34,31 @@ Multiple communication protocols:
|
||||
- **WebSocket** (`core/websocket.nim`): Full-duplex streaming
|
||||
- **Embedded** (`storage/lsm.nim`): Direct in-process access
|
||||
|
||||
### Server Architecture
|
||||
|
||||
The TCP and HTTP servers share a single LSMTree instance to ensure data consistency:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ SHARED STORAGE │
|
||||
│ LSMTree Instance │
|
||||
├────────────────────────┬────────────────────────────────┤
|
||||
│ TCP Server │ HTTP Server │
|
||||
│ (Binary Protocol) │ (REST API) │
|
||||
│ Port: 9472 │ Port: 9912 │
|
||||
│ TCP_NODELAY: ON │ Multi-threaded │
|
||||
└────────────────────────┴────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Key optimizations:**
|
||||
- **Shared LSMTree** — Both servers operate on the same database instance, eliminating data inconsistency
|
||||
- **TCP_NODELAY** — Enabled on both listening and client sockets for lower latency on small messages
|
||||
- **Safe byte conversion** — Proper `bytesToString`/`stringToBytes` functions instead of unsafe `cast` operations
|
||||
|
||||
### Connection Management
|
||||
|
||||
- **Connection Pool** (`protocol/pool.nim`): Min/max connection limits with idle timeout
|
||||
- **Rate Limiting** (`protocol/ratelimit.nim`): Token-bucket global and per-client limits
|
||||
- **Rate Limiting** (`protocol/ratelimit.nim`): Token-bucket global and per-client limits, integrated in both TCP and HTTP handlers
|
||||
- **Authentication** (`protocol/auth.nim`): JWT with HMAC-SHA256 and role-based access
|
||||
- **TLS/SSL** (`protocol/ssl.nim`): TLS 1.3 with auto-generated certificates
|
||||
|
||||
@@ -121,7 +142,7 @@ Client → Protocol → Auth → Parser → AST → IR → Codegen
|
||||
- **Raft Consensus** (`core/raft.nim`): Leader election, log replication
|
||||
- **Sharding** (`core/sharding.nim`): Hash, range, and consistent hashing
|
||||
- **Replication** (`core/replication.nim`): Sync, async, semi-sync modes
|
||||
- **Gossip Protocol** (`core/gossip.nim`): SWIM-like membership management
|
||||
- **Gossip Protocol** (`core/gossip.nim`): SWIM-like membership management with exponential backoff error recovery
|
||||
- **Distributed Transactions** (`core/disttxn.nim`): Two-phase commit
|
||||
|
||||
## Key Design Decisions
|
||||
|
||||
@@ -2,6 +2,21 @@
|
||||
|
||||
All notable changes to BaraDB are documented in this file.
|
||||
|
||||
## [Unreleased] — Server Architecture Improvements
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Shared Storage Instance** — TCP and HTTP servers now share a single LSMTree instance instead of creating separate ones, eliminating data inconsistency between protocols
|
||||
- **Unsafe Cast Operations** — Replaced all `cast[string]` and `cast[seq[byte]]` with safe `bytesToString`/`stringToBytes` helper functions that properly copy data for ARC/ORC memory management compatibility
|
||||
|
||||
### Changed
|
||||
|
||||
- **TCP_NODELAY Enabled** — Both listening and client sockets now have TCP_NODELAY set, reducing latency for small messages (queries, acks) by disabling Nagle's algorithm
|
||||
- **Rate Limiter Integrated** — Token-bucket rate limiter is now active in both TCP and HTTP server handlers:
|
||||
- TCP: Per-client rate limiting on query messages (error code 429)
|
||||
- HTTP: Rate limiting on `/query` and `/batch` endpoints with `X-Forwarded-For` support
|
||||
- **Gossip Error Handling** — Improved UDP socket error recovery with exponential backoff (100ms-5s) and socket recreation only after 10 consecutive failures
|
||||
|
||||
## [Unreleased] — AI-Native Platform
|
||||
|
||||
### Added
|
||||
|
||||
@@ -45,8 +45,10 @@ BaraDB can be configured via **environment variables**, a **config file**, or **
|
||||
|----------|---------|-------------|
|
||||
| `BARADB_AUTH_ENABLED` | `false` | Enable authentication |
|
||||
| `BARADB_JWT_SECRET` | — | JWT signing secret |
|
||||
| `BARADB_RATE_LIMIT_GLOBAL` | `10000` | Global requests per second |
|
||||
| `BARADB_RATE_LIMIT_PER_CLIENT` | `1000` | Per-client requests per second |
|
||||
| `BARADB_RATE_LIMIT_GLOBAL` | `10000` | Global requests per minute (token-bucket) |
|
||||
| `BARADB_RATE_LIMIT_PER_CLIENT` | `1000` | Per-client requests per minute (token-bucket) |
|
||||
|
||||
> **Note:** Rate limiting is enforced at the protocol level in both TCP and HTTP servers. TCP uses client connection ID for per-client limits. HTTP uses `X-Forwarded-For` header (for proxy setups) or a global key.
|
||||
|
||||
### Logging
|
||||
|
||||
|
||||
@@ -11,6 +11,11 @@ BaraDB supports multiple protocols for client communication:
|
||||
|
||||
The binary protocol uses big-endian encoding for all multi-byte values.
|
||||
|
||||
### Connection Optimizations
|
||||
|
||||
- **TCP_NODELAY** — Enabled on both server and client sockets to minimize latency for small messages (queries, acks). This disables Nagle's algorithm, ensuring packets are sent immediately without buffering.
|
||||
- **Rate Limiting** — Token-bucket rate limiter is integrated at the protocol level. Queries exceeding the rate limit receive error code 429.
|
||||
|
||||
### Connection Lifecycle
|
||||
|
||||
```
|
||||
@@ -142,6 +147,18 @@ printf '\x00\x00\x00\x12\x01\x02\x00\x00\x00\x00\x08SELECT 1' > /dev/tcp/localho
|
||||
|
||||
Base URL: `http://localhost:9470/api/v1`
|
||||
|
||||
### Rate Limiting
|
||||
|
||||
All query endpoints (`/query`, `/batch`) are protected by a token-bucket rate limiter:
|
||||
- **Global rate** — Configured via `BARADB_RATE_LIMIT_GLOBAL` (default: 10,000 requests/minute)
|
||||
- **Per-client rate** — Configured via `BARADB_RATE_LIMIT_PER_CLIENT` (default: 1,000 requests/minute)
|
||||
- **Client identification** — Uses `X-Forwarded-For` header when behind a proxy, otherwise uses a global key
|
||||
|
||||
When rate-limited, the server returns HTTP 429 with:
|
||||
```json
|
||||
{"error": "Rate limit exceeded"}
|
||||
```
|
||||
|
||||
### Endpoints
|
||||
|
||||
#### Health
|
||||
|
||||
Reference in New Issue
Block a user