mirror of
https://github.com/KLogicHQ/nats-console.git
synced 2026-10-15 00:52:46 +00:00
ede3b87d8c
update design file.
4811 lines
406 KiB
Markdown
4811 lines
406 KiB
Markdown
# NATS JetStream Management Console - System Design Document
|
||
|
||
## Executive Summary
|
||
|
||
A modern, enterprise-grade web console for managing NATS JetStream clusters, inspired by Redpanda Console and Confluent Control Center. This design covers architecture, database schemas, UI/UX patterns, authentication, and analytics infrastructure.
|
||
|
||
---
|
||
|
||
## 1. System Architecture Overview
|
||
|
||
### 1.1 High-Level Architecture
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CLIENTS │
|
||
│ (Web Browsers / Mobile / API Consumers) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ LOAD BALANCER / CDN │
|
||
│ (Nginx / Cloudflare / AWS ALB) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────┴─────────────────┐
|
||
▼ ▼
|
||
┌──────────────────────────────┐ ┌──────────────────────────────────────┐
|
||
│ FRONTEND (Next.js) │ │ API GATEWAY │
|
||
│ ─────────────────────────── │ │ ────────────────────────────────────│
|
||
│ • SSR/SSG Pages │ │ • Rate Limiting │
|
||
│ • React Components │ │ • Request Validation │
|
||
│ • TanStack Query │ │ • API Versioning │
|
||
│ • Zustand State │ │ • Request Logging │
|
||
│ • Tailwind CSS │ │ • CORS Handling │
|
||
│ • shadcn/ui Components │ └──────────────────────────────────────┘
|
||
└──────────────────────────────┘ │
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ BACKEND SERVICES (Node.js/TypeScript) │
|
||
├─────────────────┬─────────────────┬─────────────────┬───────────────────────┤
|
||
│ Auth Service │ Core API │ Analytics │ Background Workers │
|
||
│ ────────────── │ Service │ Service │ ─────────────────── │
|
||
│ • JWT/Sessions │ ────────────── │ ───────────────│ • Metrics Collector │
|
||
│ • OAuth/OIDC │ • Streams CRUD │ • Query Engine │ • Alert Processor │
|
||
│ • RBAC Engine │ • Consumers │ • Aggregations │ • Audit Logger │
|
||
│ • User Mgmt │ • Messages │ • Dashboards │ • Cleanup Jobs │
|
||
│ • Teams/Orgs │ • Cluster Ops │ • Reports │ • Sync Jobs │
|
||
└─────────────────┴─────────────────┴─────────────────┴───────────────────────┘
|
||
│ │ │ │
|
||
▼ ▼ ▼ ▼
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DATA LAYER │
|
||
├──────────────────┬──────────────────┬──────────────────┬────────────────────┤
|
||
│ PostgreSQL │ Redis │ ClickHouse │ NATS JetStream │
|
||
│ ────────────── │ ────────────── │ ──────────────│ ──────────────── │
|
||
│ • Users/Auth │ • Sessions │ • Metrics TS │ • Streams │
|
||
│ • Teams/Orgs │ • Cache │ • Audit Logs │ • Consumers │
|
||
│ • Permissions │ • Rate Limits │ • Message Stats│ • Messages │
|
||
│ • Configs │ • Real-time │ • Aggregates │ • Cluster State │
|
||
│ • Audit Meta │ • Pub/Sub │ • Long History │ • KV Store │
|
||
└──────────────────┴──────────────────┴──────────────────┴────────────────────┘
|
||
```
|
||
|
||
### 1.2 Service Communication
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ COMMUNICATION PATTERNS │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌──────────┐ REST/GraphQL ┌──────────────┐ │
|
||
│ │ Frontend │◄──────────────────►│ API Gateway │ │
|
||
│ └──────────┘ └──────────────┘ │
|
||
│ │ │
|
||
│ ┌───────────────┼───────────────┐ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Auth │ │ Core │ │Analytics │ │
|
||
│ │ Service │ │ Service │ │ Service │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||
│ │ │ │ │
|
||
│ └───────────────┼───────────────┘ │
|
||
│ │ │
|
||
│ Internal gRPC / NATS │
|
||
│ │ │
|
||
│ ┌───────────────┴───────────────┐ │
|
||
│ ▼ ▼ │
|
||
│ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ Workers │ │ NATS │ │
|
||
│ │ (JetStream) │ │ JetStream │ │
|
||
│ └──────────────┘ └──────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Database Schema Design
|
||
|
||
### 2.1 PostgreSQL Schema (Application Data)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ POSTGRESQL SCHEMA │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ organizations │ │ users │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ name VARCHAR│ │ email VARCHAR│
|
||
│ slug VARCHAR│◄────┐│ password_hash VARCHAR│
|
||
│ plan ENUM │ ││ first_name VARCHAR│
|
||
│ settings JSONB │ ││ last_name VARCHAR│
|
||
│ created_at TIMESTAMP ││ avatar_url VARCHAR│
|
||
│ updated_at TIMESTAMP ││ status ENUM │
|
||
└────────────────────────┘ ││ email_verified BOOLEAN│
|
||
│ ││ mfa_enabled BOOLEAN│
|
||
│ ││ mfa_secret VARCHAR│
|
||
▼ ││ last_login_at TIMESTAMP
|
||
┌────────────────────────┐ ││ created_at TIMESTAMP
|
||
│ organization_members │ ││ updated_at TIMESTAMP
|
||
├────────────────────────┤ │└────────────────────────┘
|
||
│ id UUID PK│ │
|
||
│ org_id UUID FK│─────┘ │
|
||
│ user_id UUID FK│───────────────┘
|
||
│ role ENUM │
|
||
│ invited_by UUID FK│
|
||
│ joined_at TIMESTAMP
|
||
└────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ teams │ │ team_members │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ org_id UUID FK│◄─────│ team_id UUID FK│
|
||
│ name VARCHAR│ │ user_id UUID FK│
|
||
│ description TEXT │ │ role ENUM │
|
||
│ created_at TIMESTAMP │ added_at TIMESTAMP
|
||
│ updated_at TIMESTAMP └────────────────────────┘
|
||
└────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ nats_clusters │ │ cluster_connections │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ org_id UUID FK│◄─────│ cluster_id UUID FK│
|
||
│ name VARCHAR│ │ server_url VARCHAR│
|
||
│ description TEXT │ │ credentials JSONB │ (encrypted)
|
||
│ environment ENUM │ │ tls_config JSONB │
|
||
│ status ENUM │ │ is_primary BOOLEAN│
|
||
│ version VARCHAR│ │ health_status ENUM │
|
||
│ created_at TIMESTAMP │ last_health_check TIMESTAMP
|
||
│ updated_at TIMESTAMP └────────────────────────┘
|
||
└────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ stream_configs │ │ consumer_configs │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ cluster_id UUID FK│◄─────│ stream_config_id UUID FK│
|
||
│ stream_name VARCHAR│ │ consumer_name VARCHAR│
|
||
│ config_snapshot JSONB │ │ config_snapshot JSONB │
|
||
│ created_by UUID FK│ │ created_by UUID FK│
|
||
│ is_managed BOOLEAN│ │ is_managed BOOLEAN│
|
||
│ tags JSONB │ │ tags JSONB │
|
||
│ created_at TIMESTAMP │ created_at TIMESTAMP
|
||
│ updated_at TIMESTAMP │ updated_at TIMESTAMP
|
||
└────────────────────────┘ └────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ roles │ │ permissions │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ org_id UUID FK│◄─────│ role_id UUID FK│
|
||
│ name VARCHAR│ │ resource VARCHAR│
|
||
│ description TEXT │ │ action VARCHAR│
|
||
│ is_system BOOLEAN│ │ conditions JSONB │
|
||
│ created_at TIMESTAMP └────────────────────────┘
|
||
│ updated_at TIMESTAMP
|
||
└────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ api_keys │ │ sessions │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ org_id UUID FK│ │ user_id UUID FK│
|
||
│ user_id UUID FK│ │ token_hash VARCHAR│
|
||
│ name VARCHAR│ │ ip_address INET │
|
||
│ key_hash VARCHAR│ │ user_agent TEXT │
|
||
│ prefix VARCHAR│ │ expires_at TIMESTAMP
|
||
│ permissions JSONB │ │ created_at TIMESTAMP
|
||
│ last_used_at TIMESTAMP └────────────────────────┘
|
||
│ expires_at TIMESTAMP
|
||
│ created_at TIMESTAMP
|
||
└────────────────────────┘
|
||
|
||
┌────────────────────────┐ ┌────────────────────────┐
|
||
│ saved_queries │ │ dashboards │
|
||
├────────────────────────┤ ├────────────────────────┤
|
||
│ id UUID PK│ │ id UUID PK│
|
||
│ org_id UUID FK│ │ org_id UUID FK│
|
||
│ user_id UUID FK│ │ user_id UUID FK│
|
||
│ name VARCHAR│ │ name VARCHAR│
|
||
│ query TEXT │ │ layout JSONB │
|
||
│ description TEXT │ │ widgets JSONB │
|
||
│ is_shared BOOLEAN│ │ is_shared BOOLEAN│
|
||
│ created_at TIMESTAMP │ created_at TIMESTAMP
|
||
│ updated_at TIMESTAMP │ updated_at TIMESTAMP
|
||
└────────────────────────┘ └────────────────────────┘
|
||
|
||
┌────────────────────────┐
|
||
│ alert_rules │
|
||
├────────────────────────┤
|
||
│ id UUID PK│
|
||
│ org_id UUID FK│
|
||
│ cluster_id UUID FK│
|
||
│ name VARCHAR│
|
||
│ condition JSONB │
|
||
│ threshold JSONB │
|
||
│ severity ENUM │
|
||
│ channels JSONB │
|
||
│ is_enabled BOOLEAN│
|
||
│ cooldown_mins INTEGER│
|
||
│ created_at TIMESTAMP
|
||
│ updated_at TIMESTAMP
|
||
└────────────────────────┘
|
||
```
|
||
|
||
### 2.2 ClickHouse Schema (Analytics & Time-Series)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CLICKHOUSE SCHEMA │
|
||
│ (Optimized for Time-Series Analytics) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: stream_metrics │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (cluster_id, stream_name, timestamp) │
|
||
│ TTL: timestamp + INTERVAL 90 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ stream_name String │
|
||
│ timestamp DateTime64(3) │
|
||
│ messages_total UInt64 │
|
||
│ bytes_total UInt64 │
|
||
│ messages_rate Float64 (msgs/sec) │
|
||
│ bytes_rate Float64 (bytes/sec) │
|
||
│ consumer_count UInt32 │
|
||
│ first_seq UInt64 │
|
||
│ last_seq UInt64 │
|
||
│ subjects Array(String) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: consumer_metrics │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (cluster_id, stream_name, consumer_name, timestamp) │
|
||
│ TTL: timestamp + INTERVAL 90 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ stream_name String │
|
||
│ consumer_name String │
|
||
│ timestamp DateTime64(3) │
|
||
│ pending_count UInt64 │
|
||
│ ack_pending UInt64 │
|
||
│ redelivered UInt64 │
|
||
│ waiting UInt64 │
|
||
│ delivered_rate Float64 │
|
||
│ ack_rate Float64 │
|
||
│ lag Int64 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: cluster_metrics │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (cluster_id, server_id, timestamp) │
|
||
│ TTL: timestamp + INTERVAL 180 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ server_id String │
|
||
│ server_name String │
|
||
│ timestamp DateTime64(3) │
|
||
│ cpu_percent Float32 │
|
||
│ memory_bytes UInt64 │
|
||
│ connections UInt32 │
|
||
│ subscriptions UInt32 │
|
||
│ slow_consumers UInt32 │
|
||
│ in_msgs UInt64 │
|
||
│ out_msgs UInt64 │
|
||
│ in_bytes UInt64 │
|
||
│ out_bytes UInt64 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: message_samples │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (cluster_id, stream_name, subject, timestamp) │
|
||
│ TTL: timestamp + INTERVAL 7 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ stream_name String │
|
||
│ subject String │
|
||
│ sequence UInt64 │
|
||
│ timestamp DateTime64(3) │
|
||
│ headers Map(String, String) │
|
||
│ payload_preview String (first 1KB, truncated) │
|
||
│ payload_size UInt32 │
|
||
│ payload_type String (json, protobuf, avro, binary) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: audit_logs │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (org_id, timestamp, action) │
|
||
│ TTL: timestamp + INTERVAL 365 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ id UUID │
|
||
│ org_id UUID │
|
||
│ user_id UUID │
|
||
│ user_email String │
|
||
│ timestamp DateTime64(3) │
|
||
│ action String (stream.create, consumer.delete, etc)│
|
||
│ resource_type String │
|
||
│ resource_id String │
|
||
│ resource_name String │
|
||
│ cluster_id Nullable(UUID) │
|
||
│ ip_address IPv6 │
|
||
│ user_agent String │
|
||
│ request_id String │
|
||
│ changes String (JSON diff) │
|
||
│ status Enum('success', 'failure', 'denied') │
|
||
│ error_message Nullable(String) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TABLE: alert_events │
|
||
│ ENGINE: MergeTree() │
|
||
│ PARTITION BY: toYYYYMM(timestamp) │
|
||
│ ORDER BY: (org_id, alert_rule_id, timestamp) │
|
||
│ TTL: timestamp + INTERVAL 90 DAY │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ id UUID │
|
||
│ org_id UUID │
|
||
│ alert_rule_id UUID │
|
||
│ cluster_id UUID │
|
||
│ timestamp DateTime64(3) │
|
||
│ severity Enum('info', 'warning', 'critical') │
|
||
│ status Enum('firing', 'resolved') │
|
||
│ metric_value Float64 │
|
||
│ threshold_value Float64 │
|
||
│ message String │
|
||
│ notified_at Nullable(DateTime64(3)) │
|
||
│ resolved_at Nullable(DateTime64(3)) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ MATERIALIZED VIEW: stream_metrics_hourly │
|
||
│ ENGINE: SummingMergeTree() │
|
||
│ PARTITION BY: toYYYYMM(hour) │
|
||
│ ORDER BY: (cluster_id, stream_name, hour) │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ stream_name String │
|
||
│ hour DateTime │
|
||
│ messages_sum UInt64 │
|
||
│ bytes_sum UInt64 │
|
||
│ avg_rate AggregateFunction(avg, Float64) │
|
||
│ max_rate AggregateFunction(max, Float64) │
|
||
│ sample_count UInt64 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ MATERIALIZED VIEW: stream_metrics_daily │
|
||
│ ENGINE: SummingMergeTree() │
|
||
│ PARTITION BY: toYYYYMM(day) │
|
||
│ ORDER BY: (cluster_id, stream_name, day) │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ cluster_id UUID │
|
||
│ stream_name String │
|
||
│ day Date │
|
||
│ messages_sum UInt64 │
|
||
│ bytes_sum UInt64 │
|
||
│ avg_rate AggregateFunction(avg, Float64) │
|
||
│ max_rate AggregateFunction(max, Float64) │
|
||
│ sample_count UInt64 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.3 Redis Data Structures
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ REDIS DATA STRUCTURES │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
SESSION MANAGEMENT
|
||
──────────────────
|
||
Key Pattern: session:{session_id}
|
||
Type: Hash
|
||
TTL: 24 hours (configurable)
|
||
Fields:
|
||
- user_id
|
||
- org_id
|
||
- email
|
||
- roles (JSON array)
|
||
- permissions (JSON array)
|
||
- ip_address
|
||
- created_at
|
||
- last_activity
|
||
|
||
RATE LIMITING
|
||
─────────────
|
||
Key Pattern: ratelimit:{user_id}:{endpoint}
|
||
Type: String (counter)
|
||
TTL: 60 seconds (sliding window)
|
||
|
||
API KEY CACHE
|
||
─────────────
|
||
Key Pattern: apikey:{key_prefix}
|
||
Type: Hash
|
||
TTL: 5 minutes
|
||
Fields:
|
||
- org_id
|
||
- user_id
|
||
- permissions (JSON)
|
||
- rate_limit
|
||
|
||
CLUSTER STATUS CACHE
|
||
────────────────────
|
||
Key Pattern: cluster:{cluster_id}:status
|
||
Type: Hash
|
||
TTL: 30 seconds
|
||
Fields:
|
||
- status (connected/disconnected/degraded)
|
||
- server_count
|
||
- version
|
||
- last_check
|
||
|
||
STREAM LIST CACHE
|
||
─────────────────
|
||
Key Pattern: cluster:{cluster_id}:streams
|
||
Type: String (JSON array)
|
||
TTL: 60 seconds
|
||
|
||
REAL-TIME METRICS (Pub/Sub)
|
||
───────────────────────────
|
||
Channel: metrics:{cluster_id}:{stream_name}
|
||
Message: JSON payload with current metrics
|
||
|
||
USER PERMISSIONS CACHE
|
||
──────────────────────
|
||
Key Pattern: permissions:{user_id}:{org_id}
|
||
Type: Set
|
||
TTL: 5 minutes
|
||
Members: permission strings (e.g., "streams:read", "consumers:write")
|
||
|
||
ACTIVE USERS TRACKING
|
||
─────────────────────
|
||
Key Pattern: active_users:{org_id}
|
||
Type: Sorted Set
|
||
Score: Unix timestamp of last activity
|
||
Member: user_id
|
||
|
||
NOTIFICATION QUEUE
|
||
──────────────────
|
||
Key Pattern: notifications:{user_id}
|
||
Type: List
|
||
Elements: JSON notification objects
|
||
```
|
||
|
||
---
|
||
|
||
## 3. API Design
|
||
|
||
### 3.1 REST API Structure
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ API ENDPOINTS │
|
||
│ Base: /api/v1 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
AUTHENTICATION
|
||
──────────────
|
||
POST /auth/login Email/password login
|
||
POST /auth/logout Invalidate session
|
||
POST /auth/refresh Refresh access token
|
||
POST /auth/register User registration
|
||
POST /auth/forgot-password Request password reset
|
||
POST /auth/reset-password Complete password reset
|
||
POST /auth/verify-email Verify email address
|
||
GET /auth/me Get current user
|
||
POST /auth/mfa/enable Enable MFA
|
||
POST /auth/mfa/verify Verify MFA code
|
||
DELETE /auth/mfa/disable Disable MFA
|
||
|
||
OAUTH/SSO
|
||
─────────
|
||
GET /auth/oauth/{provider} Initiate OAuth flow (google, github, okta)
|
||
GET /auth/oauth/{provider}/callback OAuth callback
|
||
POST /auth/saml/login SAML login initiation
|
||
POST /auth/saml/acs SAML assertion consumer service
|
||
|
||
USERS
|
||
─────
|
||
GET /users List users (org scoped)
|
||
GET /users/{id} Get user details
|
||
PATCH /users/{id} Update user
|
||
DELETE /users/{id} Delete/deactivate user
|
||
POST /users/invite Invite user to org
|
||
GET /users/{id}/activity Get user activity log
|
||
|
||
ORGANIZATIONS
|
||
─────────────
|
||
GET /organizations List user's organizations
|
||
POST /organizations Create organization
|
||
GET /organizations/{id} Get organization details
|
||
PATCH /organizations/{id} Update organization
|
||
DELETE /organizations/{id} Delete organization
|
||
GET /organizations/{id}/members List members
|
||
POST /organizations/{id}/members Add member
|
||
DELETE /organizations/{id}/members/{uid} Remove member
|
||
|
||
TEAMS
|
||
─────
|
||
GET /teams List teams
|
||
POST /teams Create team
|
||
GET /teams/{id} Get team
|
||
PATCH /teams/{id} Update team
|
||
DELETE /teams/{id} Delete team
|
||
GET /teams/{id}/members List team members
|
||
POST /teams/{id}/members Add team member
|
||
DELETE /teams/{id}/members/{uid} Remove team member
|
||
|
||
CLUSTERS
|
||
────────
|
||
GET /clusters List NATS clusters
|
||
POST /clusters Add cluster connection
|
||
GET /clusters/{id} Get cluster details
|
||
PATCH /clusters/{id} Update cluster config
|
||
DELETE /clusters/{id} Remove cluster
|
||
GET /clusters/{id}/health Health check
|
||
GET /clusters/{id}/servers List servers in cluster
|
||
GET /clusters/{id}/info Detailed cluster info
|
||
|
||
STREAMS
|
||
───────
|
||
GET /clusters/{cid}/streams List streams
|
||
POST /clusters/{cid}/streams Create stream
|
||
GET /clusters/{cid}/streams/{name} Get stream details
|
||
PATCH /clusters/{cid}/streams/{name} Update stream config
|
||
DELETE /clusters/{cid}/streams/{name} Delete stream
|
||
GET /clusters/{cid}/streams/{name}/info Stream info/stats
|
||
POST /clusters/{cid}/streams/{name}/purge Purge messages
|
||
GET /clusters/{cid}/streams/{name}/messages Browse messages
|
||
POST /clusters/{cid}/streams/{name}/messages Publish message
|
||
DELETE /clusters/{cid}/streams/{name}/messages/{seq} Delete message
|
||
|
||
CONSUMERS
|
||
─────────
|
||
GET /clusters/{cid}/streams/{sid}/consumers List consumers
|
||
POST /clusters/{cid}/streams/{sid}/consumers Create consumer
|
||
GET /clusters/{cid}/streams/{sid}/consumers/{name} Get consumer
|
||
PATCH /clusters/{cid}/streams/{sid}/consumers/{name} Update consumer
|
||
DELETE /clusters/{cid}/streams/{sid}/consumers/{name} Delete consumer
|
||
GET /clusters/{cid}/streams/{sid}/consumers/{name}/info Consumer stats
|
||
POST /clusters/{cid}/streams/{sid}/consumers/{name}/pause Pause consumer
|
||
|
||
KV STORES
|
||
─────────
|
||
GET /clusters/{cid}/kv List KV buckets
|
||
POST /clusters/{cid}/kv Create KV bucket
|
||
GET /clusters/{cid}/kv/{bucket} Get bucket info
|
||
DELETE /clusters/{cid}/kv/{bucket} Delete bucket
|
||
GET /clusters/{cid}/kv/{bucket}/keys List keys
|
||
GET /clusters/{cid}/kv/{bucket}/keys/{key} Get value
|
||
PUT /clusters/{cid}/kv/{bucket}/keys/{key} Set value
|
||
DELETE /clusters/{cid}/kv/{bucket}/keys/{key} Delete key
|
||
GET /clusters/{cid}/kv/{bucket}/keys/{key}/history Key history
|
||
|
||
OBJECT STORES
|
||
─────────────
|
||
GET /clusters/{cid}/objects List object stores
|
||
POST /clusters/{cid}/objects Create object store
|
||
GET /clusters/{cid}/objects/{store} Get store info
|
||
DELETE /clusters/{cid}/objects/{store} Delete store
|
||
GET /clusters/{cid}/objects/{store}/files List files
|
||
GET /clusters/{cid}/objects/{store}/files/{name} Download file
|
||
PUT /clusters/{cid}/objects/{store}/files/{name} Upload file
|
||
DELETE /clusters/{cid}/objects/{store}/files/{name} Delete file
|
||
|
||
ANALYTICS
|
||
─────────
|
||
GET /analytics/metrics Query metrics
|
||
GET /analytics/streams/{name}/throughput Stream throughput
|
||
GET /analytics/streams/{name}/latency Consumer latency
|
||
GET /analytics/consumers/{name}/lag Consumer lag
|
||
GET /analytics/cluster/overview Cluster overview stats
|
||
POST /analytics/query Custom ClickHouse query
|
||
|
||
DASHBOARDS
|
||
──────────
|
||
GET /dashboards List dashboards
|
||
POST /dashboards Create dashboard
|
||
GET /dashboards/{id} Get dashboard
|
||
PATCH /dashboards/{id} Update dashboard
|
||
DELETE /dashboards/{id} Delete dashboard
|
||
POST /dashboards/{id}/clone Clone dashboard
|
||
|
||
ALERTS
|
||
──────
|
||
GET /alerts/rules List alert rules
|
||
POST /alerts/rules Create alert rule
|
||
GET /alerts/rules/{id} Get alert rule
|
||
PATCH /alerts/rules/{id} Update alert rule
|
||
DELETE /alerts/rules/{id} Delete alert rule
|
||
GET /alerts/events List alert events
|
||
POST /alerts/test Test alert rule
|
||
|
||
AUDIT
|
||
─────
|
||
GET /audit/logs Query audit logs
|
||
GET /audit/logs/export Export audit logs (CSV/JSON)
|
||
|
||
API KEYS
|
||
────────
|
||
GET /api-keys List API keys
|
||
POST /api-keys Create API key
|
||
GET /api-keys/{id} Get API key details
|
||
DELETE /api-keys/{id} Revoke API key
|
||
POST /api-keys/{id}/rotate Rotate API key
|
||
|
||
ROLES & PERMISSIONS
|
||
───────────────────
|
||
GET /roles List roles
|
||
POST /roles Create custom role
|
||
GET /roles/{id} Get role
|
||
PATCH /roles/{id} Update role
|
||
DELETE /roles/{id} Delete role
|
||
GET /permissions List all permissions
|
||
```
|
||
|
||
### 3.2 WebSocket API
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ WEBSOCKET CHANNELS │
|
||
│ Endpoint: /ws/v1/realtime │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CONNECTION
|
||
──────────
|
||
{
|
||
"type": "auth",
|
||
"token": "jwt_token_here"
|
||
}
|
||
|
||
SUBSCRIBE TO CHANNELS
|
||
─────────────────────
|
||
{
|
||
"type": "subscribe",
|
||
"channels": [
|
||
"cluster:{cluster_id}:status",
|
||
"stream:{cluster_id}:{stream_name}:metrics",
|
||
"consumer:{cluster_id}:{stream_name}:{consumer_name}:metrics",
|
||
"alerts:{org_id}"
|
||
]
|
||
}
|
||
|
||
UNSUBSCRIBE
|
||
───────────
|
||
{
|
||
"type": "unsubscribe",
|
||
"channels": ["stream:{cluster_id}:{stream_name}:metrics"]
|
||
}
|
||
|
||
MESSAGE TYPES (Server → Client)
|
||
───────────────────────────────
|
||
|
||
// Cluster Status Update
|
||
{
|
||
"type": "cluster_status",
|
||
"cluster_id": "uuid",
|
||
"data": {
|
||
"status": "connected",
|
||
"servers": [...],
|
||
"timestamp": "2024-01-15T10:30:00Z"
|
||
}
|
||
}
|
||
|
||
// Stream Metrics
|
||
{
|
||
"type": "stream_metrics",
|
||
"cluster_id": "uuid",
|
||
"stream_name": "ORDERS",
|
||
"data": {
|
||
"messages": 1523456,
|
||
"bytes": 234567890,
|
||
"rate": 1250.5,
|
||
"consumers": 5,
|
||
"timestamp": "2024-01-15T10:30:00Z"
|
||
}
|
||
}
|
||
|
||
// Consumer Metrics
|
||
{
|
||
"type": "consumer_metrics",
|
||
"cluster_id": "uuid",
|
||
"stream_name": "ORDERS",
|
||
"consumer_name": "processor",
|
||
"data": {
|
||
"pending": 150,
|
||
"lag": 2500,
|
||
"ack_rate": 980.2,
|
||
"timestamp": "2024-01-15T10:30:00Z"
|
||
}
|
||
}
|
||
|
||
// Alert Notification
|
||
{
|
||
"type": "alert",
|
||
"data": {
|
||
"id": "uuid",
|
||
"rule_id": "uuid",
|
||
"severity": "critical",
|
||
"message": "Consumer lag exceeded threshold",
|
||
"timestamp": "2024-01-15T10:30:00Z"
|
||
}
|
||
}
|
||
|
||
// Message Preview (for message browser)
|
||
{
|
||
"type": "new_message",
|
||
"cluster_id": "uuid",
|
||
"stream_name": "ORDERS",
|
||
"data": {
|
||
"sequence": 1523456,
|
||
"subject": "orders.created",
|
||
"timestamp": "2024-01-15T10:30:00Z",
|
||
"preview": "..."
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 4. UI/UX Design
|
||
|
||
### 4.1 Application Layout
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ ┌─────┐ NATS Console [Search...] [?] [@] [Bell] [Avatar▼]│
|
||
│ │Logo │ Acme Corp ▼ │
|
||
├──┴─────┴────────────────────────────────────────────────────────────────────┤
|
||
│ │ │
|
||
│ │ [🏠] Overview │
|
||
│ │ │
|
||
│ │ [📊] Clusters ┌────────────────────────────────────┐│
|
||
│ │ └─ Production │ ││
|
||
│ │ └─ Staging │ MAIN CONTENT AREA ││
|
||
│ │ └─ Development │ ││
|
||
│ │ │ (Dynamic based on selection) ││
|
||
│ │ [📦] Streams │ ││
|
||
│ │ │ ││
|
||
│ │ [👥] Consumers │ ││
|
||
│ │ │ ││
|
||
│ │ [🔑] KV Stores │ ││
|
||
│ │ │ ││
|
||
│ │ [📁] Object Stores │ ││
|
||
│ │ │ ││
|
||
│ │ [📈] Analytics │ ││
|
||
│ │ └─ Dashboards │ ││
|
||
│ │ └─ Metrics │ ││
|
||
│ │ │ ││
|
||
│ │ [🔔] Alerts │ ││
|
||
│ │ │ ││
|
||
│ │ ───────────── │ ││
|
||
│ │ │ ││
|
||
│ │ [⚙️] Settings │ ││
|
||
│ │ └─ Organization │ ││
|
||
│ │ └─ Users & Teams │ ││
|
||
│ │ └─ API Keys │ ││
|
||
│ │ └─ Audit Logs │ ││
|
||
│ │ └────────────────────────────────────┘│
|
||
│ │ │
|
||
└──┴──────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4.2 Key Screen Designs
|
||
|
||
#### Dashboard / Overview
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Overview [Last 24h ▼] [↻] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 3 Clusters │ │ 24 Streams │ │ 89 Consumers │ │ 2 Alerts │ │
|
||
│ │ ● 3 Healthy │ │ ↑ 2.1M/sec │ │ ↑ 1.8M/sec │ │ ⚠ 2 Warning │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
│ │
|
||
│ ┌───────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Message Throughput │ │
|
||
│ │ │ │
|
||
│ │ 2.5M ┤ ╭─────╮ │ │
|
||
│ │ │ ╭─────╯ │ │ │
|
||
│ │ 2.0M ┤ ╭─────╯ │ │ │
|
||
│ │ │ ╭─────╯ ╰─────╮ │ │
|
||
│ │ 1.5M ┤ ╭─────╯ ╰─────╮ │ │
|
||
│ │ │ ╭─────╯ ╰─── │ │
|
||
│ │ 1.0M ┼──────╯ │ │
|
||
│ │ └────────────────────────────────────────────────────────────── │ │
|
||
│ │ 00:00 04:00 08:00 12:00 16:00 20:00 Now │ │
|
||
│ └───────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │
|
||
│ │ Top Streams by Volume │ │ Consumer Lag │ │
|
||
│ │ ───────────────────────────── │ │ ───────────────────────────── │ │
|
||
│ │ ORDERS ████████ 45% │ │ order-processor ⚠ 12,500 │ │
|
||
│ │ EVENTS █████░░░ 28% │ │ notification-svc ● 234 │ │
|
||
│ │ NOTIFICATIONS ███░░░░░ 15% │ │ analytics-worker ● 45 │ │
|
||
│ │ AUDIT ██░░░░░░ 8% │ │ audit-logger ● 12 │ │
|
||
│ │ Other █░░░░░░░ 4% │ │ backup-sync ● 0 │ │
|
||
│ └─────────────────────────────────┘ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ Recent Activity │
|
||
│ ─────────────────────────────────────────────────────────────────────── │
|
||
│ ● 10:45 Stream ORDERS config updated by john@acme.com │
|
||
│ ● 10:32 Consumer order-processor created by jane@acme.com │
|
||
│ ⚠ 10:15 Alert: Consumer lag threshold exceeded on order-processor │
|
||
│ ● 09:58 New cluster connection added: production-east │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### Streams List
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Streams [+ Create Stream] │
|
||
│ Production Cluster │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Search streams...] Filters: [All ▼] [Tags ▼] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ □ Name │ Subjects │ Messages │ Storage │ Consumers │ ⋮ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ □ ORDERS │ orders.> │ 15.2M │ 2.3 GB │ 5 │ ⋮ ││
|
||
│ │ ● Healthy │ │ ↑ 1,250/s │ │ │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ □ EVENTS │ events.> │ 89.5M │ 12.1 GB │ 12 │ ⋮ ││
|
||
│ │ ● Healthy │ │ ↑ 3,420/s │ │ │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ □ NOTIFICATIONS │ notify.* │ 5.8M │ 890 MB │ 3 │ ⋮ ││
|
||
│ │ ● Healthy │ │ ↑ 520/s │ │ │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ □ AUDIT │ audit.> │ 234.2M │ 45.2 GB │ 2 │ ⋮ ││
|
||
│ │ ⚠ High Volume │ │ ↑ 8,100/s │ │ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Showing 4 of 24 streams [◀ 1 2 3 4 5 ▶] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### Stream Detail
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ ← Streams / ORDERS [Edit] [Purge] [Delete] [⋮] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Overview] [Messages] [Consumers] [Configuration] [Metrics] │
|
||
│ ────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Stream Health ● Healthy │ │
|
||
│ │ │ │
|
||
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
|
||
│ │ │ Messages │ │ Storage │ │ Consumers │ │ Throughput │ │ │
|
||
│ │ │ 15,234,567 │ │ 2.34 GB │ │ 5 active │ │ 1,250/sec │ │ │
|
||
│ │ │ ↑ 12.5% │ │ ↑ 234 MB │ │ │ │ ↑ 8.2% │ │ │
|
||
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Message Rate (Last 6 hours) [Export] │ │
|
||
│ │ │ │
|
||
│ │ 1.5K ┤ ╭────╮ ╭────────╮ │ │
|
||
│ │ │ ╭────╯ ╰──────╮ ╭────╯ ╰───╮ │ │
|
||
│ │ 1.0K ┼─────╯ ╰─────────╯ ╰──── │ │
|
||
│ │ │ │ │
|
||
│ │ 500 ┤ │ │
|
||
│ │ └────────────────────────────────────────────────────────── │ │
|
||
│ │ 06:00 08:00 10:00 12:00 14:00 Now │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Configuration Summary │
|
||
│ ─────────────────────────────────────────────────────────────────────── │
|
||
│ Subjects orders.> │
|
||
│ Retention Limits (Max Messages: 10M, Max Bytes: 10GB) │
|
||
│ Storage File │
|
||
│ Replicas 3 │
|
||
│ Discard Old │
|
||
│ Max Age 7 days │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### Message Browser
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ ← ORDERS / Messages [Publish Message] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Subject Filter: [orders.> ] From: [Sequence ▼] [_________] │
|
||
│ [🔴 Live] [Parse as: JSON ▼] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Seq │ Subject │ Time │ Size │ Headers │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ 15234567 │ orders.created │ 10:45:23.456 │ 1.2 KB │ 3 │ ▶ ││
|
||
│ │ 15234566 │ orders.updated │ 10:45:23.234 │ 890 B │ 2 │ ▶ ││
|
||
│ │ 15234565 │ orders.created │ 10:45:22.987 │ 1.1 KB │ 3 │ ▶ ││
|
||
│ │ 15234564 │ orders.shipped │ 10:45:22.654 │ 2.3 KB │ 4 │ ▶ ││
|
||
│ │ 15234563 │ orders.created │ 10:45:22.123 │ 1.2 KB │ 3 │ ▶ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Message #15234567 [Copy] [Delete]││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Subject: orders.created ││
|
||
│ │ Time: 2024-01-15T10:45:23.456Z ││
|
||
│ │ Sequence: 15234567 ││
|
||
│ │ ││
|
||
│ │ Headers: ││
|
||
│ │ ┌─────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Content-Type: application/json │ ││
|
||
│ │ │ X-Correlation-ID: abc-123-def │ ││
|
||
│ │ │ X-Source: order-service │ ││
|
||
│ │ └─────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Payload: ││
|
||
│ │ ┌─────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ { │ ││
|
||
│ │ │ "order_id": "ORD-2024-78945", │ ││
|
||
│ │ │ "customer_id": "CUST-12345", │ ││
|
||
│ │ │ "items": [ │ ││
|
||
│ │ │ { "sku": "PROD-001", "qty": 2, "price": 29.99 }, │ ││
|
||
│ │ │ { "sku": "PROD-042", "qty": 1, "price": 149.99 } │ ││
|
||
│ │ │ ], │ ││
|
||
│ │ │ "total": 209.97, │ ││
|
||
│ │ │ "created_at": "2024-01-15T10:45:23.456Z" │ ││
|
||
│ │ │ } │ ││
|
||
│ │ └─────────────────────────────────────────────────────────────────┘ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### Consumer Detail
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ ← ORDERS / Consumers / order-processor [Edit] [Pause] [Delete]│
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Overview] [Pending Messages] [Configuration] [Metrics] │
|
||
│ ────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Consumer Health ● Active │ │
|
||
│ │ │ │
|
||
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
|
||
│ │ │ Pending │ │ Ack Pending│ │ Lag │ │ Redeliver │ │ │
|
||
│ │ │ 1,234 │ │ 45 │ │ 12,500 │ │ 23 │ │ │
|
||
│ │ │ ● Normal │ │ ● Normal │ │ ⚠ Warning │ │ ● Normal │ │ │
|
||
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │
|
||
│ │ Processing Rate │ │ Consumer Lag │ │
|
||
│ │ │ │ │ │
|
||
│ │ 1.2K ┤ ╭───╮ ╭──── │ │ 15K ┤╭─╮ │ │
|
||
│ │ │╭───╯ ╰───╮╭──╯ │ │ ││ ╰╮ │ │
|
||
│ │ 800 ┼╯ ╰╯ │ │ 10K ┼╯ ╰╮ │ │
|
||
│ │ │ │ │ │ ╰──╮ │ │
|
||
│ │ 400 ┤ │ │ 5K ┤ ╰──────────── │ │
|
||
│ │ └─────────────────────── │ │ └──────────────────────── │ │
|
||
│ │ -6h -4h -2h Now │ │ -6h -4h -2h Now │ │
|
||
│ └─────────────────────────────────┘ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ Configuration │
|
||
│ ─────────────────────────────────────────────────────────────────────── │
|
||
│ Durable Name order-processor │
|
||
│ Deliver Policy All │
|
||
│ Ack Policy Explicit │
|
||
│ Ack Wait 30s │
|
||
│ Max Deliver 5 │
|
||
│ Filter Subject orders.> │
|
||
│ Max Ack Pending 1000 │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### User Management
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Settings / Users & Teams [+ Invite User] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Users] [Teams] [Roles] │
|
||
│ ────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ [Search users...] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ │ User │ Email │ Role │ Status │ ⋮ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ [A] │ John Smith │ john@acme.com │ Admin │ Active │ ⋮ ││
|
||
│ │ │ Last login: 2 hrs ago │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ [J] │ Jane Doe │ jane@acme.com │ Editor │ Active │ ⋮ ││
|
||
│ │ │ Last login: 1 day ago │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ [B] │ Bob Wilson │ bob@acme.com │ Viewer │ Active │ ⋮ ││
|
||
│ │ │ Last login: 3 days ago │ ││
|
||
│ ├───────────────────────────────────────────────────────────────────────┤│
|
||
│ │ [?] │ alice@acme.com │ alice@acme.com │ Editor │ Pending│ ⋮ ││
|
||
│ │ │ Invitation sent: 2 hrs ago │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Role Permissions Matrix [+ New Role] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ │ Admin │ Editor │ Viewer │ Operator │ ││
|
||
│ │ ──────────────────────┼───────┼────────┼────────┼──────────┤ ││
|
||
│ │ Streams: View │ ● │ ● │ ● │ ● │ ││
|
||
│ │ Streams: Create │ ● │ ● │ ○ │ ○ │ ││
|
||
│ │ Streams: Edit │ ● │ ● │ ○ │ ○ │ ││
|
||
│ │ Streams: Delete │ ● │ ○ │ ○ │ ○ │ ││
|
||
│ │ Messages: Browse │ ● │ ● │ ● │ ● │ ││
|
||
│ │ Messages: Publish │ ● │ ● │ ○ │ ● │ ││
|
||
│ │ Consumers: Manage │ ● │ ● │ ○ │ ● │ ││
|
||
│ │ Users: Manage │ ● │ ○ │ ○ │ ○ │ ││
|
||
│ │ Settings: Access │ ● │ ○ │ ○ │ ○ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Authentication & Authorization
|
||
|
||
### 5.1 Authentication Flows
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AUTHENTICATION ARCHITECTURE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
EMAIL/PASSWORD FLOW
|
||
───────────────────
|
||
┌──────────┐ 1. Login Request ┌──────────────┐
|
||
│ │ ──────────────────────► │ │
|
||
│ Client │ │ Auth │
|
||
│ │ ◄────────────────────── │ Service │
|
||
└──────────┘ 2. JWT + Refresh Token └──────────────┘
|
||
│ │
|
||
│ 3. API Request + JWT │ Verify credentials
|
||
▼ ▼
|
||
┌──────────────┐ ┌──────────────┐
|
||
│ API Gateway │ ─────────────────────► │ PostgreSQL │
|
||
│ (Validate) │ │ (Users) │
|
||
└──────────────┘ └──────────────┘
|
||
|
||
OAUTH/OIDC FLOW
|
||
───────────────
|
||
┌──────────┐ 1. Initiate ┌──────────────┐ 2. Redirect ┌──────────────┐
|
||
│ Client │ ─────────────► │ Auth │ ────────────► │ OAuth │
|
||
│ │ │ Service │ │ Provider │
|
||
│ │ ◄───────────── │ │ ◄──────────── │ (Google, │
|
||
└──────────┘ 5. JWT Token └──────────────┘ 4. Auth Code │ GitHub,etc) │
|
||
│ └──────────────┘
|
||
│ 3. Exchange code
|
||
▼
|
||
┌──────────────┐
|
||
│ Create/Link │
|
||
│ User Account│
|
||
└──────────────┘
|
||
|
||
MFA FLOW
|
||
────────
|
||
┌──────────┐ 1. Login ┌──────────────┐
|
||
│ │ ─────────────► │ │
|
||
│ Client │ │ Auth │
|
||
│ │ ◄───────────── │ Service │
|
||
│ │ 2. MFA Required│ │
|
||
│ │ │ │
|
||
│ │ ─────────────► │ │
|
||
│ │ 3. TOTP Code │ │
|
||
│ │ ◄───────────── │ │
|
||
└──────────┘ 4. JWT Token └──────────────┘
|
||
|
||
TOKEN STRUCTURE
|
||
───────────────
|
||
Access Token (JWT, 15 min expiry):
|
||
{
|
||
"sub": "user_uuid",
|
||
"org": "org_uuid",
|
||
"email": "user@example.com",
|
||
"roles": ["admin"],
|
||
"permissions": ["streams:*", "consumers:*"],
|
||
"iat": 1705312800,
|
||
"exp": 1705313700
|
||
}
|
||
|
||
Refresh Token (Opaque, 7 day expiry):
|
||
- Stored in Redis with user metadata
|
||
- Single use, rotated on each refresh
|
||
- Tied to device/session
|
||
```
|
||
|
||
### 5.2 Authorization Model (RBAC)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ RBAC PERMISSION MODEL │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
PERMISSION STRUCTURE
|
||
────────────────────
|
||
Format: {resource}:{action}:{scope}
|
||
|
||
Resources:
|
||
- clusters
|
||
- streams
|
||
- consumers
|
||
- kv_stores
|
||
- object_stores
|
||
- messages
|
||
- users
|
||
- teams
|
||
- roles
|
||
- api_keys
|
||
- alerts
|
||
- dashboards
|
||
- audit_logs
|
||
|
||
Actions:
|
||
- read
|
||
- create
|
||
- update
|
||
- delete
|
||
- publish (messages)
|
||
- purge (streams)
|
||
- pause (consumers)
|
||
- manage (full control)
|
||
|
||
Scopes:
|
||
- * (all)
|
||
- own (user's own resources)
|
||
- team:{team_id} (team resources)
|
||
- cluster:{cluster_id} (specific cluster)
|
||
|
||
BUILT-IN ROLES
|
||
──────────────
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Role: Admin │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Permissions: *:*:* (Full access to everything) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Role: Editor │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Permissions: │
|
||
│ - clusters:read:* │
|
||
│ - streams:read,create,update:* │
|
||
│ - consumers:read,create,update,delete:* │
|
||
│ - messages:read,publish:* │
|
||
│ - kv_stores:read,create,update:* │
|
||
│ - object_stores:read,create,update:* │
|
||
│ - dashboards:*:own │
|
||
│ - alerts:read,create,update:* │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Role: Viewer │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Permissions: │
|
||
│ - clusters:read:* │
|
||
│ - streams:read:* │
|
||
│ - consumers:read:* │
|
||
│ - messages:read:* │
|
||
│ - kv_stores:read:* │
|
||
│ - object_stores:read:* │
|
||
│ - dashboards:read:* │
|
||
│ - alerts:read:* │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Role: Operator │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Permissions: │
|
||
│ - clusters:read:* │
|
||
│ - streams:read:* │
|
||
│ - consumers:read,pause:* │
|
||
│ - messages:read,publish:* │
|
||
│ - kv_stores:read,update:* │
|
||
│ - object_stores:read:* │
|
||
│ - alerts:read:* │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
AUTHORIZATION CHECK FLOW
|
||
────────────────────────
|
||
┌──────────┐ Request ┌──────────────┐ Check ┌──────────────┐
|
||
│ │ ───────────────► │ │ ────────────► │ │
|
||
│ Client │ │ API Gateway │ │ Permission │
|
||
│ │ │ │ ◄──────────── │ Service │
|
||
│ │ ◄─────────────── │ │ Allow/Deny │ │
|
||
└──────────┘ Response └──────────────┘ └──────────────┘
|
||
│ │
|
||
Extract JWT ┌─────┴─────┐
|
||
Get permissions │ │
|
||
▼ ▼
|
||
┌────────┐ ┌────────┐
|
||
│ Redis │ │ Postgres│
|
||
│ Cache │ │ (Roles)│
|
||
└────────┘ └────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Technology Stack
|
||
|
||
### 6.1 Frontend Stack
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ FRONTEND TECHNOLOGY STACK │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CORE FRAMEWORK
|
||
──────────────
|
||
Next.js 14+ App Router, Server Components, Server Actions
|
||
React 18+ Concurrent features, Suspense
|
||
TypeScript 5+ Strict mode enabled
|
||
|
||
STATE MANAGEMENT
|
||
────────────────
|
||
Zustand Global client state
|
||
TanStack Query Server state, caching, mutations
|
||
React Hook Form Form state management
|
||
Zod Schema validation
|
||
|
||
UI COMPONENTS
|
||
─────────────
|
||
shadcn/ui Base component library
|
||
Radix UI Accessible primitives
|
||
Tailwind CSS Utility-first styling
|
||
Lucide Icons Icon library
|
||
Recharts Charts and graphs
|
||
React Table Data tables
|
||
Monaco Editor Code/JSON editing
|
||
cmdk Command palette
|
||
|
||
REAL-TIME
|
||
─────────
|
||
Socket.io Client WebSocket connections
|
||
React use Optimistic updates
|
||
|
||
DEVELOPER EXPERIENCE
|
||
────────────────────
|
||
ESLint Linting
|
||
Prettier Code formatting
|
||
Vitest Unit testing
|
||
Playwright E2E testing
|
||
Storybook Component documentation
|
||
```
|
||
|
||
### 6.2 Backend Stack
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ BACKEND TECHNOLOGY STACK │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
RUNTIME & FRAMEWORK
|
||
───────────────────
|
||
Node.js 20 LTS Runtime
|
||
Fastify HTTP framework (faster than Express)
|
||
tRPC End-to-end type safety (optional, with REST)
|
||
TypeScript 5+ Strict mode
|
||
|
||
DATABASE CLIENTS
|
||
────────────────
|
||
Drizzle ORM PostgreSQL (type-safe, lightweight)
|
||
@clickhouse/client ClickHouse analytics
|
||
ioredis Redis client
|
||
nats.js NATS JetStream client
|
||
|
||
AUTHENTICATION
|
||
──────────────
|
||
jose JWT handling
|
||
passport OAuth strategies
|
||
speakeasy TOTP/MFA
|
||
argon2 Password hashing
|
||
|
||
BACKGROUND JOBS
|
||
───────────────
|
||
NATS JetStream Job queues (internal streams)
|
||
node-cron Scheduled tasks
|
||
|
||
OBSERVABILITY
|
||
─────────────
|
||
Pino Structured logging
|
||
OpenTelemetry Distributed tracing
|
||
Prometheus client Metrics export
|
||
|
||
VALIDATION
|
||
──────────
|
||
Zod Schema validation
|
||
class-validator DTO validation (alternative)
|
||
|
||
TESTING
|
||
───────
|
||
Vitest Unit tests
|
||
Supertest API tests
|
||
Testcontainers Integration tests
|
||
```
|
||
|
||
### 6.3 Infrastructure
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ INFRASTRUCTURE COMPONENTS │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
DATABASES
|
||
─────────
|
||
PostgreSQL 16 Primary application database
|
||
ClickHouse Time-series analytics
|
||
Redis 7 Caching, sessions, pub/sub
|
||
|
||
NATS
|
||
────
|
||
NATS Server Core messaging
|
||
JetStream Persistence layer
|
||
|
||
DEPLOYMENT
|
||
──────────
|
||
Docker Containerization
|
||
Kubernetes Orchestration (production)
|
||
Docker Compose Local development
|
||
|
||
REVERSE PROXY
|
||
─────────────
|
||
Nginx Load balancing, SSL termination
|
||
Caddy Alternative (auto SSL)
|
||
|
||
MONITORING
|
||
──────────
|
||
Prometheus Metrics collection
|
||
Grafana Dashboards
|
||
Jaeger Distributed tracing
|
||
|
||
CI/CD
|
||
─────
|
||
GitHub Actions Primary CI/CD
|
||
ArgoCD GitOps deployment (K8s)
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Security Considerations
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ SECURITY ARCHITECTURE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
AUTHENTICATION SECURITY
|
||
───────────────────────
|
||
• JWT with short expiry (15 min) + rotating refresh tokens
|
||
• Secure HttpOnly cookies for token storage
|
||
• MFA support (TOTP, WebAuthn future)
|
||
• Rate limiting on auth endpoints
|
||
• Account lockout after failed attempts
|
||
• Session management with device tracking
|
||
|
||
DATA SECURITY
|
||
─────────────
|
||
• Encryption at rest (database level)
|
||
• TLS 1.3 for all connections
|
||
• Sensitive fields encrypted at application level
|
||
• NATS credentials stored encrypted (AES-256-GCM)
|
||
• API keys hashed (Argon2) with prefix visible
|
||
• Audit logging for all sensitive operations
|
||
|
||
API SECURITY
|
||
────────────
|
||
• CORS configuration
|
||
• Rate limiting per user/API key
|
||
• Request validation (Zod schemas)
|
||
• SQL injection prevention (parameterized queries)
|
||
• XSS prevention (Content Security Policy)
|
||
• CSRF tokens for state-changing operations
|
||
|
||
INFRASTRUCTURE SECURITY
|
||
───────────────────────
|
||
• Network segmentation (internal services not exposed)
|
||
• Secrets management (Vault/Kubernetes secrets)
|
||
• Container security scanning
|
||
• Regular dependency updates
|
||
• Security headers (HSTS, X-Frame-Options, etc.)
|
||
|
||
COMPLIANCE READY
|
||
────────────────
|
||
• Full audit trail in ClickHouse
|
||
• Data retention policies
|
||
• User consent management
|
||
• GDPR-compliant data export/deletion
|
||
• SOC 2 Type II alignment
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Deployment Architecture
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ PRODUCTION DEPLOYMENT (KUBERNETES) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────┐
|
||
│ CloudFlare │
|
||
│ (CDN + WAF) │
|
||
└────────┬────────┘
|
||
│
|
||
┌────────▼────────┐
|
||
│ Ingress │
|
||
│ Controller │
|
||
└────────┬────────┘
|
||
│
|
||
┌────────────────────────────┼────────────────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||
│ Frontend │ │ API Service │ │ Workers │
|
||
│ (Next.js) │ │ (Fastify) │ │ (JetStream) │
|
||
│ ──────────── │ │ ──────────── │ │ ──────────── │
|
||
│ Replicas: 3 │ │ Replicas: 5 │ │ Replicas: 3 │
|
||
│ CPU: 500m │ │ CPU: 1000m │ │ CPU: 500m │
|
||
│ Mem: 512Mi │ │ Mem: 1Gi │ │ Mem: 512Mi │
|
||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||
│ │ │
|
||
└────────────────────────────┼────────────────────────────┘
|
||
│
|
||
┌────────────────────────────┼────────────────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||
│ PostgreSQL │ │ ClickHouse │ │ Redis │
|
||
│ (HA Cluster) │ │ (Cluster) │ │ (Sentinel) │
|
||
│ ──────────── │ │ ──────────── │ │ ──────────── │
|
||
│ 3 nodes │ │ 3 shards │ │ 3 nodes │
|
||
│ Patroni │ │ 2 replicas │ │ Sentinel │
|
||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||
|
||
NAMESPACE ORGANIZATION
|
||
──────────────────────
|
||
• nats-console-prod Production workloads
|
||
• nats-console-staging Staging environment
|
||
• nats-console-infra Shared infrastructure (DBs)
|
||
• nats-console-monitor Monitoring stack
|
||
|
||
HORIZONTAL POD AUTOSCALER
|
||
─────────────────────────
|
||
API Service:
|
||
- Min: 3, Max: 20
|
||
- CPU target: 70%
|
||
- Custom metric: requests/sec
|
||
|
||
Workers:
|
||
- Min: 2, Max: 10
|
||
- Custom metric: queue depth
|
||
|
||
PERSISTENT VOLUMES
|
||
──────────────────
|
||
PostgreSQL: 100Gi SSD (each node)
|
||
ClickHouse: 500Gi SSD (each shard)
|
||
Redis: 20Gi SSD (persistence)
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Feature Roadmap
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ FEATURE ROADMAP │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
PHASE 1: MVP (Months 1-3)
|
||
─────────────────────────
|
||
✓ Core authentication (email/password, OAuth)
|
||
✓ Basic RBAC (Admin, Editor, Viewer)
|
||
✓ Cluster connection management
|
||
✓ Stream CRUD operations
|
||
✓ Consumer CRUD operations
|
||
✓ Basic message browser
|
||
✓ Real-time metrics dashboard
|
||
✓ PostgreSQL + Redis setup
|
||
|
||
PHASE 2: Analytics & Monitoring (Months 4-5)
|
||
────────────────────────────────────────────
|
||
○ ClickHouse integration
|
||
○ Historical metrics storage
|
||
○ Custom dashboards builder
|
||
○ Alert rules engine
|
||
○ Webhook notifications
|
||
○ Consumer lag tracking
|
||
○ Throughput analytics
|
||
|
||
PHASE 3: Enterprise Features (Months 6-8)
|
||
─────────────────────────────────────────
|
||
○ SSO/SAML integration
|
||
○ Advanced RBAC (custom roles)
|
||
○ Team management
|
||
○ Audit logging
|
||
○ Multi-cluster management
|
||
○ KV Store browser
|
||
○ Object Store browser
|
||
○ Schema registry integration
|
||
|
||
PHASE 4: Advanced Capabilities (Months 9-12)
|
||
────────────────────────────────────────────
|
||
○ Message replay functionality
|
||
○ Dead letter queue management
|
||
○ Stream mirroring configuration
|
||
○ Partition/subject analytics
|
||
○ Cost analysis dashboard
|
||
○ API key management
|
||
○ Terraform provider
|
||
○ CLI tool
|
||
|
||
PHASE 5: Polish & Scale (Months 12+)
|
||
────────────────────────────────────
|
||
○ Mobile app
|
||
○ Dark mode
|
||
○ Internationalization
|
||
○ Plugin system
|
||
○ Marketplace
|
||
○ White-label support
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Project Structure
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ PROJECT STRUCTURE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
nats-console/
|
||
├── apps/
|
||
│ ├── web/ # Next.js frontend
|
||
│ │ ├── app/ # App router pages
|
||
│ │ │ ├── (auth)/ # Auth pages (login, register)
|
||
│ │ │ ├── (dashboard)/ # Main dashboard pages
|
||
│ │ │ │ ├── clusters/
|
||
│ │ │ │ ├── streams/
|
||
│ │ │ │ ├── consumers/
|
||
│ │ │ │ ├── analytics/
|
||
│ │ │ │ └── settings/
|
||
│ │ │ ├── api/ # API routes (if needed)
|
||
│ │ │ └── layout.tsx
|
||
│ │ ├── components/
|
||
│ │ │ ├── ui/ # shadcn components
|
||
│ │ │ ├── clusters/
|
||
│ │ │ ├── streams/
|
||
│ │ │ ├── consumers/
|
||
│ │ │ ├── charts/
|
||
│ │ │ └── common/
|
||
│ │ ├── hooks/
|
||
│ │ ├── lib/
|
||
│ │ ├── stores/ # Zustand stores
|
||
│ │ └── styles/
|
||
│ │
|
||
│ └── api/ # Fastify backend
|
||
│ ├── src/
|
||
│ │ ├── modules/
|
||
│ │ │ ├── auth/
|
||
│ │ │ ├── users/
|
||
│ │ │ ├── organizations/
|
||
│ │ │ ├── clusters/
|
||
│ │ │ ├── streams/
|
||
│ │ │ ├── consumers/
|
||
│ │ │ ├── analytics/
|
||
│ │ │ └── alerts/
|
||
│ │ ├── common/
|
||
│ │ │ ├── middleware/
|
||
│ │ │ ├── guards/
|
||
│ │ │ ├── decorators/
|
||
│ │ │ └── utils/
|
||
│ │ ├── database/
|
||
│ │ │ ├── postgres/
|
||
│ │ │ ├── clickhouse/
|
||
│ │ │ └── redis/
|
||
│ │ ├── nats/ # NATS client wrapper
|
||
│ │ ├── workers/ # Background jobs
|
||
│ │ └── websocket/ # Real-time handlers
|
||
│ └── tests/
|
||
│
|
||
├── packages/
|
||
│ ├── shared/ # Shared types, utils
|
||
│ │ ├── types/
|
||
│ │ ├── schemas/ # Zod schemas
|
||
│ │ └── utils/
|
||
│ ├── ui/ # Shared UI components
|
||
│ └── config/ # Shared configs
|
||
│
|
||
├── infrastructure/
|
||
│ ├── docker/
|
||
│ │ ├── Dockerfile.web
|
||
│ │ ├── Dockerfile.api
|
||
│ │ └── docker-compose.yml
|
||
│ ├── kubernetes/
|
||
│ │ ├── base/
|
||
│ │ ├── overlays/
|
||
│ │ │ ├── development/
|
||
│ │ │ ├── staging/
|
||
│ │ │ └── production/
|
||
│ │ └── kustomization.yaml
|
||
│ └── terraform/
|
||
│ ├── modules/
|
||
│ └── environments/
|
||
│
|
||
├── docs/
|
||
│ ├── architecture/
|
||
│ ├── api/
|
||
│ └── deployment/
|
||
│
|
||
├── scripts/
|
||
│ ├── setup.sh
|
||
│ ├── migrate.sh
|
||
│ └── seed.sh
|
||
│
|
||
├── turbo.json # Turborepo config
|
||
├── pnpm-workspace.yaml
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
This design provides a comprehensive foundation for building a modern NATS JetStream management console. The architecture is scalable, the database schemas are optimized for their specific use cases (PostgreSQL for transactional data, ClickHouse for analytics, Redis for caching/real-time), and the UI follows patterns established by industry leaders like Redpanda and Confluent.
|
||
|
||
|
||
----
|
||
|
||
|
||
# NATS JetStream Console - Advanced Capabilities Design Document
|
||
|
||
## Table of Contents
|
||
1. [Advanced Stream Management](#1-advanced-stream-management)
|
||
2. [Consumer Management & Orchestration](#2-consumer-management--orchestration)
|
||
3. [Message Workflows & Pipelines](#3-message-workflows--pipelines)
|
||
4. [Schema Registry & Data Governance](#4-schema-registry--data-governance)
|
||
5. [Stream Processing & Transforms](#5-stream-processing--transforms)
|
||
6. [AI-Powered Features](#6-ai-powered-features)
|
||
7. [Self-Service Portal & Quotas](#7-self-service-portal--quotas)
|
||
8. [GitOps & Infrastructure as Code](#8-gitops--infrastructure-as-code)
|
||
9. [Advanced Observability](#9-advanced-observability)
|
||
10. [Data Lineage & Catalog](#10-data-lineage--catalog)
|
||
11. [Disaster Recovery & Replication](#11-disaster-recovery--replication)
|
||
12. [Developer Experience](#12-developer-experience)
|
||
|
||
---
|
||
|
||
## 1. Advanced Stream Management
|
||
|
||
### 1.1 Stream Lifecycle Management
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ STREAM LIFECYCLE STATE MACHINE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────┐
|
||
│ DRAFT │◄──────── Save as Draft
|
||
│ (Pending) │
|
||
└──────┬──────┘
|
||
│
|
||
Validate & Create
|
||
│
|
||
▼
|
||
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
|
||
│ PAUSED │◄───────│ ACTIVE │───────►│ MAINTENANCE │
|
||
│ │ pause │ │ maint │ │
|
||
│ │───────►│ │◄───────│ │
|
||
└──────────────┘ resume └──────┬──────┘ resume └──────────────┘
|
||
│
|
||
┌──────────┼──────────┐
|
||
│ │ │
|
||
purge migrate archive
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│ PURGED │ │MIGRATING │ │ ARCHIVED │
|
||
│ │ │ │ │ │
|
||
└──────────┘ └────┬─────┘ └────┬─────┘
|
||
│ │
|
||
▼ ▼
|
||
┌──────────┐ ┌──────────┐
|
||
│ MIGRATED │ │ ARCHIVED │
|
||
│ (Shadow) │ │ (Cold) │
|
||
└──────────┘ └──────────┘
|
||
│
|
||
restore
|
||
│
|
||
▼
|
||
Back to ACTIVE
|
||
```
|
||
|
||
### 1.2 Stream Configuration Management
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ STREAM CONFIGURATION SYSTEM │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CONFIGURATION LAYERS (Inheritance Model)
|
||
────────────────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Layer 4: Stream Override │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Specific stream settings that override all lower layers │
|
||
│ Example: maxBytes: 50GB for ORDERS stream only │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ Layer 3: Environment Policy │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Environment-specific defaults (production, staging, dev) │
|
||
│ Example: Production requires replicas >= 3 │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ Layer 2: Team/Namespace Policy │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Team-level quotas and defaults │
|
||
│ Example: Team "payments" max 100GB total storage │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ Layer 1: Organization Defaults │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Base configuration for all streams │
|
||
│ Example: Default retention 7 days, default replicas 3 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
STREAM TEMPLATES LIBRARY
|
||
────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 📋 Template: High-Throughput Events │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Use Case: Real-time analytics, telemetry, logs │
|
||
│ │
|
||
│ Configuration: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ storage: "memory" │ discard: "old" │ │
|
||
│ │ retention: "limits" │ maxMsgsPerSubject: 100000 │ │
|
||
│ │ maxMsgs: 10,000,000 │ duplicateWindow: "2m" │ │
|
||
│ │ maxBytes: "10GB" │ allowRollup: true │ │
|
||
│ │ maxAge: "1h" │ denyDelete: false │ │
|
||
│ │ replicas: 1 │ denyPurge: false │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Estimated Performance: ~500K msgs/sec write, ~1M msgs/sec read │
|
||
│ Recommended Consumers: Push-based, no ack required │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 📋 Template: Transactional Work Queue │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Use Case: Order processing, payment events, critical workflows │
|
||
│ │
|
||
│ Configuration: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ storage: "file" │ discard: "new" │ │
|
||
│ │ retention: "workqueue" │ maxMsgsPerSubject: -1 │ │
|
||
│ │ maxMsgs: -1 │ duplicateWindow: "5m" │ │
|
||
│ │ maxBytes: "100GB" │ allowRollup: false │ │
|
||
│ │ maxAge: "7d" │ denyDelete: true │ │
|
||
│ │ replicas: 3 │ denyPurge: true │ │
|
||
│ │ maxMsgSize: "8MB" │ placement: { tags: ["ssd"] } │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Estimated Performance: ~50K msgs/sec write, exactly-once delivery │
|
||
│ Recommended Consumers: Pull-based, explicit ack, maxAckPending=1000 │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 📋 Template: Event Sourcing / Audit Log │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Use Case: Immutable event log, compliance audit, CQRS │
|
||
│ │
|
||
│ Configuration: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ storage: "file" │ discard: "new" │ │
|
||
│ │ retention: "limits" │ maxMsgsPerSubject: -1 │ │
|
||
│ │ maxMsgs: -1 │ duplicateWindow: "10m" │ │
|
||
│ │ maxBytes: "1TB" │ allowRollup: false │ │
|
||
│ │ maxAge: "365d" │ denyDelete: true │ │
|
||
│ │ replicas: 3 │ denyPurge: true │ │
|
||
│ │ compression: "s2" │ sealed: false (true after period) │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Special: Automatic archival to S3/GCS after 30 days │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 📋 Template: IoT Sensor Data │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ Use Case: Device telemetry, time-series data, edge computing │
|
||
│ │
|
||
│ Configuration: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ storage: "file" │ discard: "old" │ │
|
||
│ │ retention: "limits" │ maxMsgsPerSubject: 1000 │ │
|
||
│ │ maxMsgs: 100,000,000 │ duplicateWindow: "30s" │ │
|
||
│ │ maxBytes: "500GB" │ allowRollup: true │ │
|
||
│ │ maxAge: "30d" │ subjects: ["sensors.>"] │ │
|
||
│ │ replicas: 2 │ subjectTransform: { ... } │ │
|
||
│ │ compression: "s2" │ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Special: Subject hierarchy sensors.{region}.{device_id}.{metric} │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 1.3 Stream Operations UI
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Stream: ORDERS [● Active] │
|
||
│ Production Cluster │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Overview] [Messages] [Consumers] [Config] [Metrics] [Operations] [Audit] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ OPERATIONS CENTER │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Quick Actions ││
|
||
│ │ ────────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││
|
||
│ │ │ ⏸️ Pause │ │ 🗑️ Purge │ │ 📋 Clone │ │ 📤 Export │ ││
|
||
│ │ │ Stream │ │ Messages │ │ Stream │ │ Config │ ││
|
||
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ││
|
||
│ │ ││
|
||
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││
|
||
│ │ │ 🔄 Mirror │ │ 📦 Archive │ │ 🔀 Migrate │ │ ⚡ Scale │ ││
|
||
│ │ │ Setup │ │ to S3 │ │ to Cluster │ │ Replicas │ ││
|
||
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Purge Options [Run] ││
|
||
│ │ ────────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ Purge Type: ○ All Messages ││
|
||
│ │ ○ By Subject Filter: [orders.cancelled.* ] ││
|
||
│ │ ○ By Sequence Range: [________] to [________] ││
|
||
│ │ ● By Time Range: ││
|
||
│ │ ││
|
||
│ │ From: [2024-01-01 00:00 📅] To: [2024-01-07 23:59 📅] ││
|
||
│ │ ││
|
||
│ │ ☑️ Keep first message per subject (tombstone) ││
|
||
│ │ ☐ Dry run (show what would be purged) ││
|
||
│ │ ││
|
||
│ │ ⚠️ Warning: This will permanently delete ~1,234,567 messages ││
|
||
│ │ Estimated storage reclaimed: 2.3 GB ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Message Replay / Republish [Run] ││
|
||
│ │ ────────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ Source: ││
|
||
│ │ Stream: [ORDERS ▼] ││
|
||
│ │ Subject Filter: [orders.created.> ] ││
|
||
│ │ Sequence Range: [1000000 ] to [2000000 ] ││
|
||
│ │ ││
|
||
│ │ Destination: ││
|
||
│ │ ○ Same Stream (different subject) ││
|
||
│ │ New Subject Prefix: [orders.replay. ] ││
|
||
│ │ ● Different Stream ││
|
||
│ │ Target Stream: [ORDERS_REPROCESS ▼] ││
|
||
│ │ ││
|
||
│ │ Options: ││
|
||
│ │ Rate Limit: [1000 ] msgs/sec ││
|
||
│ │ ☑️ Preserve original timestamps ││
|
||
│ │ ☑️ Add replay header (X-Replay-Source) ││
|
||
│ │ ☐ Transform messages (apply function) ││
|
||
│ │ ││
|
||
│ │ Estimated: 1,000,000 messages, ~45 minutes at 1000 msgs/sec ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 1.4 Subject Management
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ SUBJECT HIERARCHY MANAGEMENT │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
SUBJECT TREE VISUALIZATION
|
||
──────────────────────────
|
||
|
||
Stream: ORDERS (subjects: orders.>)
|
||
|
||
orders
|
||
├── created │ 45.2M msgs │ 12.3 GB │ ↑ 1,250/s
|
||
│ ├── us-east │ 23.1M msgs │ 6.2 GB │ ↑ 650/s
|
||
│ ├── us-west │ 12.4M msgs │ 3.4 GB │ ↑ 350/s
|
||
│ └── eu-west │ 9.7M msgs │ 2.7 GB │ ↑ 250/s
|
||
├── updated │ 32.1M msgs │ 8.9 GB │ ↑ 890/s
|
||
│ ├── status │ 18.2M msgs │ 4.1 GB │ ↑ 520/s
|
||
│ ├── payment │ 8.9M msgs │ 2.8 GB │ ↑ 230/s
|
||
│ └── shipping │ 5.0M msgs │ 2.0 GB │ ↑ 140/s
|
||
├── cancelled │ 2.3M msgs │ 0.6 GB │ ↑ 45/s
|
||
├── completed │ 28.9M msgs │ 7.8 GB │ ↑ 780/s
|
||
└── refunded │ 1.2M msgs │ 0.3 GB │ ↑ 25/s
|
||
─────────────────────────────────
|
||
TOTAL: │109.7M msgs │ 29.9 GB │ ↑ 2,990/s
|
||
|
||
|
||
SUBJECT TRANSFORMS
|
||
──────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Subject Transform Rules [+ Add] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Rule 1: Region Normalization [Edit] [×] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Source: orders.*.us-east-1.* │ │
|
||
│ │ Destination: orders.$.us-east.$ │ │
|
||
│ │ Description: Normalize AWS region to simplified region code │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Rule 2: Legacy Subject Migration [Edit] [×] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Source: legacy.orders.* │ │
|
||
│ │ Destination: orders.migrated.$ │ │
|
||
│ │ Description: Migrate legacy subject namespace │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Rule 3: Add Timestamp Prefix [Edit] [×] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Source: orders.> │ │
|
||
│ │ Destination: orders.{{year}}.{{month}}.$ │ │
|
||
│ │ Description: Partition by year/month for archival │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Consumer Management & Orchestration
|
||
|
||
### 2.1 Consumer Lifecycle & State Machine
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CONSUMER STATE MACHINE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌──────────────┐
|
||
│ CREATING │
|
||
└──────┬───────┘
|
||
│
|
||
▼
|
||
┌────────────────────────────────────────────────────┐
|
||
│ │
|
||
▼ │
|
||
┌──────────────┐ subscribe ┌──────────────┐ │
|
||
│ INACTIVE │──────────────►│ ACTIVE │────────────┤
|
||
│ (No clients) │ │ (Running) │ │
|
||
└──────┬───────┘◄──────────────└──────┬───────┘ │
|
||
│ unsubscribe │ │
|
||
│ │ │
|
||
│ ┌────┴────┐ │
|
||
│ │ │ │
|
||
│ pause stalled │
|
||
│ │ │ │
|
||
│ ▼ ▼ │
|
||
│ ┌──────────┐ ┌──────────┐ │
|
||
│ │ PAUSED │ │ STALLED │ │
|
||
│ └────┬─────┘ └────┬─────┘ │
|
||
│ │ │ │
|
||
│ resume recover │
|
||
│ │ │ │
|
||
│ └─────┬──────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ Back to ACTIVE │
|
||
│ │
|
||
└───────────────────────┬────────────────────────────┘
|
||
│
|
||
delete
|
||
│
|
||
▼
|
||
┌──────────────┐
|
||
│ DELETED │
|
||
└──────────────┘
|
||
|
||
|
||
CONSUMER HEALTH INDICATORS
|
||
──────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Health Score Calculation │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Score Components (0-100 each, weighted average): │
|
||
│ │
|
||
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Component │ Weight │ Healthy │ Warning │ Critical │ │
|
||
│ ├──────────────────┼────────┼────────────┼────────────┼─────────────────┤ │
|
||
│ │ Lag │ 30% │ < 1000 │ 1K-10K │ > 10K │ │
|
||
│ │ Processing Rate │ 25% │ > 90% avg │ 50-90% │ < 50% │ │
|
||
│ │ Ack Pending │ 20% │ < 50% │ 50-80% │ > 80% │ │
|
||
│ │ Redelivery Rate │ 15% │ < 1% │ 1-5% │ > 5% │ │
|
||
│ │ Connection │ 10% │ Stable │ Reconnects │ Disconnected │ │
|
||
│ └────────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Overall Health: │
|
||
│ ● Healthy (80-100) ⚠️ Warning (50-79) 🔴 Critical (0-49) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.2 Consumer Groups & Scaling
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CONSUMER GROUP MANAGEMENT │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CONSUMER GROUP TOPOLOGY
|
||
───────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Consumer Group: order-processors │
|
||
│ Stream: ORDERS │ Filter: orders.created.> │ Delivery: Pull │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────────┐ │
|
||
│ │ Stream: ORDERS │ │
|
||
│ │ (10 partitions)│ │
|
||
│ └────────┬────────┘ │
|
||
│ │ │
|
||
│ ┌────────────────────┼────────────────────┐ │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
||
│ │ Consumer #1 │ │ Consumer #2 │ │ Consumer #3 │ │
|
||
│ │ ───────────────│ │ ───────────────│ │ ───────────────│ │
|
||
│ │ Host: pod-1 │ │ Host: pod-2 │ │ Host: pod-3 │ │
|
||
│ │ Partitions: 0-3│ │ Partitions: 4-6│ │ Partitions: 7-9│ │
|
||
│ │ Rate: 450/s │ │ Rate: 420/s │ │ Rate: 380/s │ │
|
||
│ │ Lag: 234 │ │ Lag: 189 │ │ Lag: 567 │ │
|
||
│ │ ● Healthy │ │ ● Healthy │ │ ⚠️ Warning │ │
|
||
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
||
│ │
|
||
│ Total Throughput: 1,250 msgs/sec │ Total Lag: 990 │ Avg Latency: 45ms │
|
||
│ │
|
||
│ [+ Add Consumer] [Rebalance] [Scale to 5] [Configure Autoscale] │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
AUTOSCALING CONFIGURATION
|
||
─────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Consumer Autoscaling: order-processors [Enabled] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Scaling Metrics │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Primary Metric: [Consumer Lag ▼] │ │
|
||
│ │ │ │
|
||
│ │ Scale Up When: │ │
|
||
│ │ Lag > [5000 ] for [3 ] consecutive checks │ │
|
||
│ │ OR Processing Rate < [80 ]% of target │ │
|
||
│ │ │ │
|
||
│ │ Scale Down When: │ │
|
||
│ │ Lag < [500 ] for [10 ] consecutive checks │ │
|
||
│ │ AND Processing Rate > [95 ]% of target │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Scaling Limits │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Minimum Consumers: [2 ] │ │
|
||
│ │ Maximum Consumers: [10 ] │ │
|
||
│ │ Scale Up Step: [2 ] consumers │ │
|
||
│ │ Scale Down Step: [1 ] consumer │ │
|
||
│ │ Cooldown Period: [5 ] minutes │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Scaling History (Last 24h) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ 10 ┤ ╭───────╮ │ │
|
||
│ │ │ ╭────╯ ╰────╮ │ │
|
||
│ │ 5 ┤ ╭────╮ ╭─────╯ ╰──────────── │ │
|
||
│ │ │────╯ ╰─────────╯ │ │
|
||
│ │ 0 ┼─────────────────────────────────────────────────────────── │ │
|
||
│ │ 00:00 06:00 12:00 18:00 Now │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.3 Dead Letter Queue Management
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DEAD LETTER QUEUE MANAGEMENT │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
DLQ ARCHITECTURE
|
||
────────────────
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ Source Stream DLQ Stream │
|
||
│ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ ORDERS │ │ ORDERS_DLQ │ │
|
||
│ │ │ │ │ │
|
||
│ │ Message ────┼───► Consumer ──┼──► Failed ───┼───► DLQ Consumer │
|
||
│ │ │ (max 5 │ Messages │ (Manual/Auto) │
|
||
│ │ │ retries) │ │ │
|
||
│ └──────────────┘ └──────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────────┐ │
|
||
│ │ DLQ Actions │ │
|
||
│ ├─────────────────────┤ │
|
||
│ │ • Retry to source │ │
|
||
│ │ • Route to handler │ │
|
||
│ │ • Archive │ │
|
||
│ │ • Delete │ │
|
||
│ │ • Transform & Retry│ │
|
||
│ └─────────────────────┘ │
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
DLQ BROWSER UI
|
||
──────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Dead Letter Queue: ORDERS_DLQ [Retry All] [Purge All] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Summary: 1,234 messages │ Oldest: 2 days ago │ Most Common: ValidationError│
|
||
│ │
|
||
│ Filter: [All Errors ▼] Subject: [____________] Time: [Last 24h ▼] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ □ │ Seq │ Original Subject │ Error Type │ Retries │ Age ││
|
||
│ ├───┼──────────┼───────────────────┼──────────────────┼─────────┼────────┤│
|
||
│ │ □ │ 45678901 │ orders.created.us │ ValidationError │ 5/5 │ 2h ago ││
|
||
│ │ │ │ │ "Invalid amount" │ │ ││
|
||
│ ├───┼──────────┼───────────────────┼──────────────────┼─────────┼────────┤│
|
||
│ │ □ │ 45678899 │ orders.created.eu │ TimeoutError │ 5/5 │ 3h ago ││
|
||
│ │ │ │ │ "DB timeout" │ │ ││
|
||
│ ├───┼──────────┼───────────────────┼──────────────────┼─────────┼────────┤│
|
||
│ │ □ │ 45678850 │ orders.updated │ SchemaError │ 5/5 │ 5h ago ││
|
||
│ │ │ │ │ "Missing field" │ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Selected Message Details │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Sequence: 45678901 ││
|
||
│ │ Original Subject: orders.created.us-east ││
|
||
│ │ Original Stream: ORDERS ││
|
||
│ │ Failed At: 2024-01-15 10:23:45 UTC ││
|
||
│ │ Retry Count: 5 of 5 ││
|
||
│ │ ││
|
||
│ │ Error Details: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Type: ValidationError │ ││
|
||
│ │ │ Message: "Field 'amount' must be positive, got: -50.00" │ ││
|
||
│ │ │ Consumer: order-processor-1 │ ││
|
||
│ │ │ Stack Trace: [Expand] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Message Payload: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ { │ ││
|
||
│ │ │ "order_id": "ORD-123456", │ ││
|
||
│ │ │ "amount": -50.00, ◄── Error source highlighted │ ││
|
||
│ │ │ "currency": "USD", │ ││
|
||
│ │ │ ... │ ││
|
||
│ │ │ } │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Actions: [Retry] [Retry with Edit] [Route to Handler] [Archive] [Del] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Error Distribution (Last 7 days) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ValidationError ████████████████████████████████ 68% ││
|
||
│ │ TimeoutError ██████████░░░░░░░░░░░░░░░░░░░░░░ 18% ││
|
||
│ │ SchemaError █████░░░░░░░░░░░░░░░░░░░░░░░░░░░ 9% ││
|
||
│ │ NetworkError ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5% ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Message Workflows & Pipelines
|
||
|
||
### 3.1 Visual Workflow Builder
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ WORKFLOW / PIPELINE BUILDER │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
WORKFLOW CANVAS
|
||
───────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Workflow: Order Processing Pipeline [Save] [Deploy] [⋮] │
|
||
│ Status: ● Running │ Last deployed: 2h ago │ Messages processed: 1.2M │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ COMPONENT PALETTE │ │
|
||
│ │ ────────────────── │ │
|
||
│ │ Sources: [📥 Stream] [📨 Subject] [⏰ Schedule] [🔗 HTTP] │ │
|
||
│ │ Transforms: [🔄 Map] [🔍 Filter] [📊 Aggregate] [🔀 Split] │ │
|
||
│ │ Actions: [📤 Publish] [💾 Store] [📧 Notify] [🌐 HTTP Call] │ │
|
||
│ │ Flow: [⑂ Branch] [⊕ Merge] [⏱️ Delay] [🔁 Retry] │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ WORKFLOW CANVAS │ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────┐ │ │
|
||
│ │ │ 📥 Source │ │ │
|
||
│ │ │ ─────────── │ │ │
|
||
│ │ │ ORDERS │ │ │
|
||
│ │ │ orders.> │ │ │
|
||
│ │ └──────┬──────┘ │ │
|
||
│ │ │ │ │
|
||
│ │ ▼ │ │
|
||
│ │ ┌─────────────┐ │ │
|
||
│ │ │ 🔍 Filter │ │ │
|
||
│ │ │ ─────────── │ │ │
|
||
│ │ │ amount>100 │ │ │
|
||
│ │ └──────┬──────┘ │ │
|
||
│ │ │ │ │
|
||
│ │ ▼ │ │
|
||
│ │ ┌─────────────┐ ┌─────────────┐ │ │
|
||
│ │ │ ⑂ Branch │────────►│ 🔄 Enrich │ │ │
|
||
│ │ │ ─────────── │ high │ ─────────── │ │ │
|
||
│ │ │ priority? │ priority│ Add customer│ │ │
|
||
│ │ └──────┬──────┘ │ data │ │ │
|
||
│ │ │ normal └──────┬──────┘ │ │
|
||
│ │ │ │ │ │
|
||
│ │ ▼ │ │ │
|
||
│ │ ┌─────────────┐ │ │ │
|
||
│ │ │ 📤 Publish │ │ │ │
|
||
│ │ │ ─────────── │ │ │ │
|
||
│ │ │ ORDERS_ │◄──────────────┘ │ │
|
||
│ │ │ PROCESSED │ │ │
|
||
│ │ └─────────────┘ │ │
|
||
│ │ │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ NODE INSPECTOR (Filter Node Selected) │
|
||
│ ┌──────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ Node: Filter [Delete Node] │ │
|
||
│ │ ────────────────────────────────────────────────────────────────── │ │
|
||
│ │ │ │
|
||
│ │ Condition Type: [Expression ▼] │ │
|
||
│ │ │ │
|
||
│ │ Expression: │ │
|
||
│ │ ┌────────────────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ msg.data.amount > 100 && msg.data.status === 'pending' │ │ │
|
||
│ │ └────────────────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ │ Test with sample message: [Test] │ │
|
||
│ │ Result: ● Pass (message would continue) │ │
|
||
│ └──────────────────────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
WORKFLOW DEFINITION SCHEMA
|
||
──────────────────────────
|
||
|
||
{
|
||
"id": "wf_order_processing",
|
||
"name": "Order Processing Pipeline",
|
||
"version": "1.2.0",
|
||
"enabled": true,
|
||
|
||
"trigger": {
|
||
"type": "stream",
|
||
"config": {
|
||
"stream": "ORDERS",
|
||
"subjects": ["orders.created.>"],
|
||
"deliverPolicy": "new",
|
||
"ackPolicy": "explicit"
|
||
}
|
||
},
|
||
|
||
"nodes": [
|
||
{
|
||
"id": "filter_high_value",
|
||
"type": "filter",
|
||
"config": {
|
||
"expression": "msg.data.amount > 100"
|
||
},
|
||
"next": {
|
||
"pass": "branch_priority",
|
||
"fail": null // Drop message
|
||
}
|
||
},
|
||
{
|
||
"id": "branch_priority",
|
||
"type": "branch",
|
||
"config": {
|
||
"conditions": [
|
||
{
|
||
"name": "high_priority",
|
||
"expression": "msg.data.priority === 'high' || msg.data.amount > 1000",
|
||
"next": "enrich_customer"
|
||
}
|
||
],
|
||
"default": "publish_standard"
|
||
}
|
||
},
|
||
{
|
||
"id": "enrich_customer",
|
||
"type": "http_call",
|
||
"config": {
|
||
"url": "https://api.internal/customers/${msg.data.customer_id}",
|
||
"method": "GET",
|
||
"timeout": "5s",
|
||
"merge": {
|
||
"path": "customer",
|
||
"mode": "shallow"
|
||
}
|
||
},
|
||
"next": "publish_priority",
|
||
"onError": "publish_standard"
|
||
},
|
||
{
|
||
"id": "publish_priority",
|
||
"type": "publish",
|
||
"config": {
|
||
"stream": "ORDERS_PRIORITY",
|
||
"subject": "orders.priority.${msg.data.region}"
|
||
}
|
||
},
|
||
{
|
||
"id": "publish_standard",
|
||
"type": "publish",
|
||
"config": {
|
||
"stream": "ORDERS_PROCESSED",
|
||
"subject": "orders.processed.${msg.data.region}"
|
||
}
|
||
}
|
||
],
|
||
|
||
"errorHandling": {
|
||
"maxRetries": 3,
|
||
"retryDelay": "1s",
|
||
"exponentialBackoff": true,
|
||
"dlq": "WORKFLOW_DLQ"
|
||
},
|
||
|
||
"monitoring": {
|
||
"metrics": true,
|
||
"tracing": true,
|
||
"alertOnError": true
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.2 Message Routing & Fan-out
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ MESSAGE ROUTING CONFIGURATION │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
ROUTING RULES ENGINE
|
||
────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Routing Rules: ORDERS Stream [+ Add Rule] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 1: High-Value Order Routing Priority: 1 [▲▼] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ WHEN: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Subject matches: orders.created.* │ ││
|
||
│ │ │ AND payload.amount > 10000 │ ││
|
||
│ │ │ AND payload.currency IN ['USD', 'EUR'] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ THEN: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ ☑️ Copy to stream: ORDERS_HIGH_VALUE │ ││
|
||
│ │ │ ☑️ Publish to subject: notifications.vip.orders │ ││
|
||
│ │ │ ☑️ Add header: X-Priority = high │ ││
|
||
│ │ │ ☐ Transform payload (apply function) │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ [Edit] [Delete] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 2: Regional Fan-out Priority: 2 [▲▼] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ WHEN: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Subject matches: orders.*.> │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ THEN: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Route to regional streams based on payload.region: │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ us-east, us-west → ORDERS_US │ ││
|
||
│ │ │ eu-west, eu-central → ORDERS_EU │ ││
|
||
│ │ │ ap-* → ORDERS_APAC │ ││
|
||
│ │ │ * (default) → ORDERS_GLOBAL │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ [Edit] [Delete] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 3: Compliance Audit Copy Priority: 10 [▲▼] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ WHEN: All messages (catch-all) ││
|
||
│ │ ││
|
||
│ │ THEN: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ ☑️ Copy to stream: AUDIT_LOG (immutable) │ ││
|
||
│ │ │ ☑️ Add headers: │ ││
|
||
│ │ │ X-Audit-Time: ${timestamp} │ ││
|
||
│ │ │ X-Audit-Hash: ${sha256(payload)} │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ [Edit] [Delete] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
FAN-OUT TOPOLOGY VISUALIZATION
|
||
──────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Fan-out Topology: ORDERS │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌─────────────┐ │
|
||
│ │ ORDERS │ │
|
||
│ │ (Source) │ │
|
||
│ │ 2.5K/sec │ │
|
||
│ └──────┬──────┘ │
|
||
│ │ │
|
||
│ ┌──────────────────────┼──────────────────────┐ │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
||
│ │ ORDERS_US │ │ ORDERS_EU │ │ ORDERS_APAC │ │
|
||
│ │ (Regional) │ │ (Regional) │ │ (Regional) │ │
|
||
│ │ 1.2K/sec │ │ 800/sec │ │ 500/sec │ │
|
||
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
|
||
│ │ │ │ │
|
||
│ │ ┌───────┴───────┐ │ │
|
||
│ │ ▼ ▼ │ │
|
||
│ │ ┌─────────────┐ ┌─────────────┐ │ │
|
||
│ │ │ EU_GDPR │ │ EU_VAT │ │ │
|
||
│ │ │ (Compliance)│ │ (Tax) │ │ │
|
||
│ │ └─────────────┘ └─────────────┘ │ │
|
||
│ │ │ │
|
||
│ └──────────────────┬──────────────────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌─────────────────┐ │
|
||
│ │ AUDIT_LOG │ │
|
||
│ │ (Immutable) │ │
|
||
│ │ 2.5K/sec │ │
|
||
│ └─────────────────┘ │
|
||
│ │
|
||
│ Legend: ──► Mirror/Copy ───► Filter/Route - - -► Conditional │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 3.3 Stream Mirroring & Sourcing
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ STREAM MIRRORING CONFIGURATION │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
MIRROR SETUP WIZARD
|
||
───────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Create Stream Mirror │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Step 2 of 4: Configure Mirror Source │
|
||
│ │
|
||
│ Source Configuration │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ Mirror Type: │ │
|
||
│ │ ● Full Mirror (all messages, 1:1 copy) │ │
|
||
│ │ ○ Filtered Mirror (subset of subjects) │ │
|
||
│ │ ○ Aggregate Mirror (multiple sources) │ │
|
||
│ │ │ │
|
||
│ │ Source Cluster: [Production US-East ▼] │ │
|
||
│ │ Source Stream: [ORDERS ▼] │ │
|
||
│ │ │ │
|
||
│ │ Start Position: │ │
|
||
│ │ ● From Beginning (full sync) │ │
|
||
│ │ ○ From Sequence: [___________] │ │
|
||
│ │ ○ From Time: [____________________📅] │ │
|
||
│ │ ○ New Messages Only │ │
|
||
│ │ │ │
|
||
│ │ Filter Subjects (optional): │ │
|
||
│ │ ┌───────────────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ orders.created.> [+ Add]│ │ │
|
||
│ │ │ orders.completed.> [× Del]│ │ │
|
||
│ │ └───────────────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Destination Configuration │
|
||
│ ┌─────────────────────────────────────────────────────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ Destination Cluster: [Production EU-West ▼] │ │
|
||
│ │ Mirror Stream Name: [ORDERS_EU_MIRROR ] │ │
|
||
│ │ │ │
|
||
│ │ Storage Override (optional): │ │
|
||
│ │ Replicas: [3 ▼] Storage: [File ▼] Max Bytes: [100GB ] │ │
|
||
│ │ │ │
|
||
│ └─────────────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ Estimated Initial Sync: ~45 minutes (based on 15.2M messages, 2.3GB) │
|
||
│ │
|
||
│ [Back] [Next: Review] [Cancel] │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
CROSS-CLUSTER REPLICATION MAP
|
||
─────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Replication Topology [+ Add Mirror] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ US-EAST (Primary) US-WEST (DR) ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ ORDERS │──────────►│ ORDERS_MIRROR │ ││
|
||
│ │ │ 15.2M msgs │ Mirror │ 15.2M msgs │ ││
|
||
│ │ │ ● In Sync │ Lag: 0 │ ● In Sync │ ││
|
||
│ │ └─────────────────┘ └─────────────────┘ ││
|
||
│ │ │ ││
|
||
│ │ │ Mirror ││
|
||
│ │ │ Lag: 234 ││
|
||
│ │ ▼ ││
|
||
│ │ ┌─────────────────┐ ││
|
||
│ │ │ EU-WEST (Edge) │ ││
|
||
│ │ ├─────────────────┤ ││
|
||
│ │ │ ORDERS_EU │ ││
|
||
│ │ │ 15.1M msgs │ ││
|
||
│ │ │ ⚠️ Lag: 234 │ ││
|
||
│ │ └─────────────────┘ ││
|
||
│ │ │ ││
|
||
│ │ │ Source ││
|
||
│ │ ▼ ││
|
||
│ │ ┌─────────────────┐ ││
|
||
│ │ │ AP-SOUTH (Edge) │ ││
|
||
│ │ ├─────────────────┤ ││
|
||
│ │ │ ORDERS_APAC │ ││
|
||
│ │ │ 8.5M msgs │ (Filtered: orders.*.ap-*) ││
|
||
│ │ │ ● In Sync │ ││
|
||
│ │ └─────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Replication Health Summary │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Mirror │ Lag │ Rate │ Status │ Actions ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ORDERS → US-WEST │ 0 │ 1.2K/s │ ● Sync │ [Pause] ││
|
||
│ │ ORDERS → EU-WEST │ 234 │ 1.1K/s │ ⚠️ Behind │ [Catch Up]││
|
||
│ │ ORDERS → AP-SOUTH │ 0 │ 450/s │ ● Sync │ [Pause] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Schema Registry & Data Governance
|
||
|
||
### 4.1 Schema Registry Integration
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ SCHEMA REGISTRY SYSTEM │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
ARCHITECTURE
|
||
────────────
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ Producers Schema Registry Consumers │
|
||
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ │
|
||
│ │ Service A│─validate───►│ │◄──fetch────│ Service X│ │
|
||
│ └──────────┘ │ PostgreSQL │ └──────────┘ │
|
||
│ ┌──────────┐ │ (Schemas) │ ┌──────────┐ │
|
||
│ │ Service B│─validate───►│ │◄──fetch────│ Service Y│ │
|
||
│ └──────────┘ │ Redis │ └──────────┘ │
|
||
│ │ (Cache) │ │
|
||
│ └──────┬───────┘ │
|
||
│ │ │
|
||
│ ┌───────────────┼───────────────┐ │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Avro │ │ JSON │ │ Protobuf │ │
|
||
│ │ Schemas │ │ Schemas │ │ Schemas │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
SCHEMA BROWSER UI
|
||
─────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Schema Registry [+ New Schema] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Schemas] [Subjects] [Compatibility] [Validation Rules] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ Search: [_________________________] Type: [All ▼] Format: [All ▼] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Schema Name │ Format │ Version │ Subjects │ Compat ││
|
||
│ ├───────────────────────────┼──────────┼─────────┼──────────┼────────────┤│
|
||
│ │ 📋 Order │ Avro │ v3 │ 4 │ BACKWARD ││
|
||
│ │ io.acme.orders.Order │ │ │ │ ││
|
||
│ ├───────────────────────────┼──────────┼─────────┼──────────┼────────────┤│
|
||
│ │ 📋 OrderCreatedEvent │ JSON │ v2 │ 2 │ FORWARD ││
|
||
│ │ orders.created │ │ │ │ ││
|
||
│ ├───────────────────────────┼──────────┼─────────┼──────────┼────────────┤│
|
||
│ │ 📋 Customer │ Protobuf │ v5 │ 3 │ FULL ││
|
||
│ │ acme.customers.v1 │ │ │ │ ││
|
||
│ ├───────────────────────────┼──────────┼─────────┼──────────┼────────────┤│
|
||
│ │ 📋 PaymentEvent │ Avro │ v1 │ 1 │ NONE ││
|
||
│ │ io.acme.payments │ │ │ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Showing 4 of 24 schemas │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
SCHEMA DETAIL VIEW
|
||
──────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Schema: Order (io.acme.orders.Order) │
|
||
│ Type: Avro │ Version: 3 │ Compatibility: BACKWARD │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Definition] [Versions] [Subjects] [Lineage] [Validation] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ Schema Definition [Edit] [Test] [⬇️] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ { ││
|
||
│ │ "type": "record", ││
|
||
│ │ "name": "Order", ││
|
||
│ │ "namespace": "io.acme.orders", ││
|
||
│ │ "doc": "Represents a customer order", ││
|
||
│ │ "fields": [ ││
|
||
│ │ { ││
|
||
│ │ "name": "order_id", ││
|
||
│ │ "type": "string", ││
|
||
│ │ "doc": "Unique order identifier" ││
|
||
│ │ }, ││
|
||
│ │ { ││
|
||
│ │ "name": "customer_id", ││
|
||
│ │ "type": "string" ││
|
||
│ │ }, ││
|
||
│ │ { ││
|
||
│ │ "name": "amount", ││
|
||
│ │ "type": { ││
|
||
│ │ "type": "bytes", ││
|
||
│ │ "logicalType": "decimal", ││
|
||
│ │ "precision": 10, ││
|
||
│ │ "scale": 2 ││
|
||
│ │ } ││
|
||
│ │ }, ││
|
||
│ │ { ││
|
||
│ │ "name": "status", ││
|
||
│ │ "type": { ││
|
||
│ │ "type": "enum", ││
|
||
│ │ "name": "OrderStatus", ││
|
||
│ │ "symbols": ["PENDING", "CONFIRMED", "SHIPPED", "DELIVERED"] ││
|
||
│ │ } ││
|
||
│ │ }, ││
|
||
│ │ { ││
|
||
│ │ "name": "metadata", ││
|
||
│ │ "type": ["null", {"type": "map", "values": "string"}], ││
|
||
│ │ "default": null ││
|
||
│ │ } ││
|
||
│ │ ] ││
|
||
│ │ } ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Version History │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ v3 (current) │ 2024-01-15 │ Added metadata field │ [View Diff] ││
|
||
│ │ v2 │ 2024-01-08 │ Added DELIVERED status │ [View Diff] ││
|
||
│ │ v1 │ 2024-01-01 │ Initial schema │ [View] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Associated Subjects │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ • orders.created.> (Stream: ORDERS) ││
|
||
│ │ • orders.updated.> (Stream: ORDERS) ││
|
||
│ │ • orders.archived.* (Stream: ORDERS_ARCHIVE) ││
|
||
│ │ • orders-dlq.* (Stream: ORDERS_DLQ) ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
SCHEMA EVOLUTION & COMPATIBILITY
|
||
────────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Schema Compatibility Check │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ New Schema Version (v4) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ + Added field: "shipping_address" (optional, with default) ││
|
||
│ │ + Added enum value: "CANCELLED" to OrderStatus ││
|
||
│ │ ~ Changed field "metadata": added "source" to default map ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Compatibility Results │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Mode: BACKWARD ││
|
||
│ │ Status: ● Compatible ││
|
||
│ │ ││
|
||
│ │ Checks: ││
|
||
│ │ ✅ New optional fields have defaults ││
|
||
│ │ ✅ No required fields removed ││
|
||
│ │ ✅ Field types unchanged ││
|
||
│ │ ✅ Enum values only added (not removed) ││
|
||
│ │ ││
|
||
│ │ Consumer Impact Analysis: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ order-processor (v3) │ ● Compatible │ No action needed │ ││
|
||
│ │ │ analytics-worker (v2) │ ● Compatible │ No action needed │ ││
|
||
│ │ │ legacy-system (v1) │ ⚠️ Degraded │ Unknown fields │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ [Cancel] [Register as v4] │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4.2 Data Quality & Validation
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DATA QUALITY RULES ENGINE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
VALIDATION RULES CONFIGURATION
|
||
──────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Data Quality Rules: ORDERS Stream [+ Add Rule] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Enforcement Mode: [Warn and Log ▼] (Reject / Warn and Log / Log Only) │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 1: Order ID Format [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Field: order_id ││
|
||
│ │ Type: Pattern Match ││
|
||
│ │ Pattern: ^ORD-[0-9]{4}-[A-Z0-9]{8}$ ││
|
||
│ │ On Failure: Reject ││
|
||
│ │ Stats: 99.8% pass rate │ 234 failures today ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 2: Amount Validation [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Field: amount ││
|
||
│ │ Type: Range Check ││
|
||
│ │ Condition: amount > 0 AND amount < 1000000 ││
|
||
│ │ On Failure: Warn ││
|
||
│ │ Stats: 99.99% pass rate │ 12 warnings today ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 3: Required Fields [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Type: Null Check ││
|
||
│ │ Fields: [order_id, customer_id, amount, status] ││
|
||
│ │ On Failure: Reject ││
|
||
│ │ Stats: 100% pass rate │ 0 failures today ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 4: Customer Exists [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Type: Lookup Validation ││
|
||
│ │ Field: customer_id ││
|
||
│ │ Lookup: KV Store "customers" key exists ││
|
||
│ │ On Failure: Warn (async check) ││
|
||
│ │ Stats: 98.5% pass rate │ 1,523 warnings today ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Rule 5: Duplicate Detection [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Type: Deduplication ││
|
||
│ │ Key: order_id ││
|
||
│ │ Window: 5 minutes ││
|
||
│ │ On Duplicate: Reject (idempotent) ││
|
||
│ │ Stats: 0.1% duplicates detected │ 89 rejected today ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Data Quality Dashboard │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Overall Quality Score: 98.7% [View Details] ││
|
||
│ │ ││
|
||
│ │ 100% ┤████████████████████████████████████████████████████████ ││
|
||
│ │ │ ╭────────╮ ││
|
||
│ │ 95% ┤ ╭────╯ ╰────╮ ││
|
||
│ │ │ ╭────╯ ╰────╮ ││
|
||
│ │ 90% ┼──────────────╯ ╰───────────── ││
|
||
│ │ └────────────────────────────────────────────────────────── ││
|
||
│ │ Mon Tue Wed Thu Fri Sat Sun ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Stream Processing & Transforms
|
||
|
||
### 5.1 Real-Time Transforms
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ STREAM TRANSFORMS ENGINE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
TRANSFORM PIPELINE ARCHITECTURE
|
||
───────────────────────────────
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ Source Stream Transform Engine Destination │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ ORDERS │─────────►│ WASM/JS │─────────►│ ORDERS_ │ │
|
||
│ │ │ │ Runtime │ │ ENRICHED │ │
|
||
│ │ Raw Events │ │ │ │ │ │
|
||
│ └──────────────┘ │ Functions: │ │ Processed │ │
|
||
│ │ • Map │ │ Events │ │
|
||
│ │ • Filter │ └──────────────┘ │
|
||
│ │ • Enrich │ │
|
||
│ │ • Aggregate │ │
|
||
│ └──────────────┘ │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ┌──────────────┐ │
|
||
│ │ ClickHouse │ │
|
||
│ │ (Metrics) │ │
|
||
│ └──────────────┘ │
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
TRANSFORM FUNCTIONS LIBRARY
|
||
───────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Transform Functions [+ Create New] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ [Built-in] [Custom] [Community] │
|
||
│ │
|
||
│ Built-in Transforms │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 📦 JSON Path Extract ││
|
||
│ │ Extract and reshape JSON fields ││
|
||
│ │ Example: $.order.items[*].sku → flat array of SKUs ││
|
||
│ │ ││
|
||
│ │ 📦 Field Rename/Remove ││
|
||
│ │ Rename, remove, or reorder fields ││
|
||
│ │ Example: customer_id → customerId, remove internal_id ││
|
||
│ │ ││
|
||
│ │ 📦 Type Coercion ││
|
||
│ │ Convert field types ││
|
||
│ │ Example: string "123.45" → decimal 123.45 ││
|
||
│ │ ││
|
||
│ │ 📦 Timestamp Transform ││
|
||
│ │ Parse, format, or convert timestamps ││
|
||
│ │ Example: Unix epoch → ISO 8601 ││
|
||
│ │ ││
|
||
│ │ 📦 Hash/Mask ││
|
||
│ │ Hash or mask sensitive data ││
|
||
│ │ Example: email → SHA256, credit_card → ****1234 ││
|
||
│ │ ││
|
||
│ │ 📦 Lookup Enrichment ││
|
||
│ │ Enrich from KV store or external API ││
|
||
│ │ Example: customer_id → full customer record ││
|
||
│ │ ││
|
||
│ │ 📦 Aggregate Window ││
|
||
│ │ Time-window aggregations ││
|
||
│ │ Example: 5-min tumbling window count by region ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Custom Transforms (JavaScript) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 🔧 order-enrichment v1.2.0 Active on 3 streams ││
|
||
│ │ Adds customer tier and discount calculation ││
|
||
│ │ [Edit] ││
|
||
│ │ ││
|
||
│ │ 🔧 pii-redaction v2.0.0 Active on 5 streams ││
|
||
│ │ Removes/masks PII fields for analytics streams ││
|
||
│ │ [Edit] ││
|
||
│ │ ││
|
||
│ │ 🔧 geo-enrichment v1.0.1 Active on 2 streams ││
|
||
│ │ Adds geolocation data from IP addresses ││
|
||
│ │ [Edit] ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
TRANSFORM EDITOR
|
||
────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Transform: order-enrichment [Save] [Test] [Deploy] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Runtime: [JavaScript (V8) ▼] Timeout: [5000 ] ms │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ // Transform function receives message and context ││
|
||
│ │ // Returns transformed message or null to filter ││
|
||
│ │ ││
|
||
│ │ export default async function transform(msg, ctx) { ││
|
||
│ │ // Access message data ││
|
||
│ │ const order = msg.data; ││
|
||
│ │ ││
|
||
│ │ // Lookup customer from KV store ││
|
||
│ │ const customer = await ctx.kv.get('customers', order.customer_id); ││
|
||
│ │ ││
|
||
│ │ // Calculate discount based on customer tier ││
|
||
│ │ const discount = calculateDiscount(customer?.tier, order.amount); ││
|
||
│ │ ││
|
||
│ │ // Return enriched message ││
|
||
│ │ return { ││
|
||
│ │ ...msg, ││
|
||
│ │ data: { ││
|
||
│ │ ...order, ││
|
||
│ │ customer_tier: customer?.tier || 'standard', ││
|
||
│ │ discount_amount: discount, ││
|
||
│ │ final_amount: order.amount - discount, ││
|
||
│ │ enriched_at: new Date().toISOString() ││
|
||
│ │ } ││
|
||
│ │ }; ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ │ function calculateDiscount(tier, amount) { ││
|
||
│ │ const rates = { platinum: 0.15, gold: 0.10, silver: 0.05 }; ││
|
||
│ │ return amount * (rates[tier] || 0); ││
|
||
│ │ } ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Test Input Test Output │
|
||
│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │
|
||
│ │ { │ │ { │ │
|
||
│ │ "order_id": "ORD-123", │ │ "order_id": "ORD-123", │ │
|
||
│ │ "customer_id": "CUST-456", │ │ "customer_id": "CUST-456", │ │
|
||
│ │ "amount": 500.00 │ │ "amount": 500.00, │ │
|
||
│ │ } │ │ "customer_tier": "gold", │ │
|
||
│ │ │ │ "discount_amount": 50.00, │ │
|
||
│ │ │ │ "final_amount": 450.00, │ │
|
||
│ │ │ │ "enriched_at": "2024-01..." │ │
|
||
│ │ │ │ } │ │
|
||
│ └─────────────────────────────────┘ └─────────────────────────────────┘ │
|
||
│ │
|
||
│ ● Test passed (23ms) │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 5.2 Aggregation & Analytics Pipelines
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ REAL-TIME AGGREGATION ENGINE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
AGGREGATION PIPELINE BUILDER
|
||
────────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Aggregation Pipeline: Order Metrics [Save] [Activate] │
|
||
│ ───────────────────────────────────────────────────────────────────────── │
|
||
│ │
|
||
│ Source: ORDERS stream │ Subject: orders.completed.> │
|
||
│ │
|
||
│ Pipeline Definition │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ WINDOW CONFIGURATION ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Window Type: [Tumbling ▼] Size: [5 ] [minutes ▼] │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ ○ Tumbling (fixed, non-overlapping) │ ││
|
||
│ │ │ ○ Sliding (overlapping windows) │ ││
|
||
│ │ │ ○ Session (activity-based) │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Late Arrival Tolerance: [1 ] [minutes ▼] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ GROUP BY ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Fields: │ ││
|
||
│ │ │ [✓] $.region │ ││
|
||
│ │ │ [✓] $.product_category │ ││
|
||
│ │ │ [ ] $.customer_tier │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ AGGREGATIONS ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Output Field │ Function │ Source Field │ ││
|
||
│ │ │ ─────────────────────────────────────────────────────────────── │ ││
|
||
│ │ │ order_count │ COUNT │ * │ ││
|
||
│ │ │ total_revenue │ SUM │ $.amount │ ││
|
||
│ │ │ avg_order_value │ AVG │ $.amount │ ││
|
||
│ │ │ max_order_value │ MAX │ $.amount │ ││
|
||
│ │ │ unique_customers │ COUNT_DIST │ $.customer_id │ ││
|
||
│ │ │ top_products │ TOP_K(10) │ $.items[*].sku │ ││
|
||
│ │ │ [+ Add] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ OUTPUT ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ [✓] Publish to Stream: ORDER_METRICS │ ││
|
||
│ │ │ Subject: metrics.orders.{region}.{product_category} │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [✓] Write to ClickHouse: order_metrics_5min │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [✓] Update KV Store: order_realtime_stats │ ││
|
||
│ │ │ Key: stats:{region}:{product_category} │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Pipeline Preview (Sample Output) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ { ││
|
||
│ │ "window_start": "2024-01-15T10:30:00Z", ││
|
||
│ │ "window_end": "2024-01-15T10:35:00Z", ││
|
||
│ │ "region": "us-east", ││
|
||
│ │ "product_category": "electronics", ││
|
||
│ │ "order_count": 1234, ││
|
||
│ │ "total_revenue": 156789.50, ││
|
||
│ │ "avg_order_value": 127.05, ││
|
||
│ │ "max_order_value": 2499.99, ││
|
||
│ │ "unique_customers": 987, ││
|
||
│ │ "top_products": ["SKU-001", "SKU-042", "SKU-108", ...] ││
|
||
│ │ } ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 6. AI-Powered Features
|
||
|
||
### 6.1 AI Assistant & Copilot
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI ASSISTANT ARCHITECTURE │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
SYSTEM ARCHITECTURE
|
||
───────────────────
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ User Interface AI Backend Data Sources │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
|
||
│ │ │ │ │ │ Stream ││
|
||
│ │ Chat UI │─────────────►│ AI Gateway │◄─────────►│ Metadata ││
|
||
│ │ │ │ │ │ ││
|
||
│ │ Context │ │ Claude API │ │ Message ││
|
||
│ │ Sidebar │ │ Integration │◄─────────►│ Samples ││
|
||
│ │ │ │ │ │ ││
|
||
│ │ Suggestions │◄─────────────│ RAG Engine │◄─────────►│ Docs & ││
|
||
│ │ Panel │ │ │ │ Schemas ││
|
||
│ │ │ │ Function │ │ ││
|
||
│ └──────────────┘ │ Calling │◄─────────►│ Metrics & ││
|
||
│ │ │ │ Analytics ││
|
||
│ └──────────────┘ └──────────────┘│
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
AI CHAT INTERFACE
|
||
─────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ NATS Console AI Assistant [⚙️] [×] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 👤 User 10:45 AM ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Why is my order-processor consumer lagging? It was fine yesterday. ││
|
||
│ │ ││
|
||
│ │ 🤖 AI Assistant 10:45 AM ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ I've analyzed the order-processor consumer and found several factors ││
|
||
│ │ contributing to the lag increase: ││
|
||
│ │ ││
|
||
│ │ 📊 **Analysis Summary** ││
|
||
│ │ ││
|
||
│ │ 1. **Traffic Spike**: Message rate increased 3x at 9:15 AM ││
|
||
│ │ • Yesterday avg: 450 msgs/sec ││
|
||
│ │ • Today peak: 1,350 msgs/sec ││
|
||
│ │ ││
|
||
│ │ 2. **Processing Slowdown**: Avg processing time increased ││
|
||
│ │ • Yesterday: 45ms/msg ││
|
||
│ │ • Today: 180ms/msg (4x slower) ││
|
||
│ │ ││
|
||
│ │ 3. **Root Cause**: Database query latency spike ││
|
||
│ │ • CustomerDB p99 latency: 150ms → 520ms ││
|
||
│ │ • Correlates with increased error rate ││
|
||
│ │ ││
|
||
│ │ 📋 **Recommended Actions** ││
|
||
│ │ ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ 1. Scale consumers from 3 to 6 [Apply] │ ││
|
||
│ │ │ 2. Enable consumer caching for customer lookups │ ││
|
||
│ │ │ 3. Add circuit breaker for CustomerDB │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Would you like me to apply the scaling change now? ││
|
||
│ │ ││
|
||
│ │ 👤 User 10:46 AM ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Yes, scale to 6 consumers and show me the impact ││
|
||
│ │ ││
|
||
│ │ 🤖 AI Assistant 10:46 AM ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ✅ Scaling order-processor from 3 to 6 consumers... ││
|
||
│ │ ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Consumer Scaling Progress │ ││
|
||
│ │ │ ████████████████████░░░░░░░░░░ 65% │ ││
|
||
│ │ │ 4/6 consumers active │ ││
|
||
│ │ │ Lag recovering: 15,234 → 8,456 (-44%) │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Quick Actions: │
|
||
│ [Explain this stream] [Suggest optimizations] [Generate consumer config] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Ask anything about your streams, consumers, or messages... [↵] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
AI CAPABILITIES MATRIX
|
||
──────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI FEATURE CAPABILITIES │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ NATURAL LANGUAGE QUERIES │
|
||
│ ──────────────────────── │
|
||
│ • "Show me streams with highest throughput" │
|
||
│ • "Which consumers have been failing?" │
|
||
│ • "What happened to ORDERS stream yesterday at 3pm?" │
|
||
│ • "Find messages containing error from last hour" │
|
||
│ • "Compare performance between prod and staging" │
|
||
│ │
|
||
│ INTELLIGENT DIAGNOSTICS │
|
||
│ ──────────────────────── │
|
||
│ • Root cause analysis for lag/failures │
|
||
│ • Correlation detection across metrics │
|
||
│ • Anomaly explanation │
|
||
│ • Performance bottleneck identification │
|
||
│ • Predictive capacity planning │
|
||
│ │
|
||
│ CONFIGURATION GENERATION │
|
||
│ ──────────────────────── │
|
||
│ • Stream config from requirements description │
|
||
│ • Consumer setup recommendations │
|
||
│ • Workflow pipeline generation │
|
||
│ • Schema inference from sample messages │
|
||
│ • Alert rule suggestions │
|
||
│ │
|
||
│ AUTOMATED ACTIONS │
|
||
│ ───────────────── │
|
||
│ • One-click fixes with preview │
|
||
│ • Safe rollback options │
|
||
│ • Approval workflow for sensitive ops │
|
||
│ • Change impact analysis │
|
||
│ │
|
||
│ LEARNING & CONTEXT │
|
||
│ ───────────────── │
|
||
│ • Remembers user preferences │
|
||
│ • Learns from organization patterns │
|
||
│ • Context-aware suggestions │
|
||
│ • Documentation integration │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 6.2 AI-Powered Insights & Anomaly Detection
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI INSIGHTS DASHBOARD │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI Insights [Configure] [Refresh] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 🎯 Active Anomalies │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 🔴 CRITICAL: Unusual Traffic Pattern Detected 10:32 AM ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Stream: ORDERS │ ││
|
||
│ │ │ Anomaly: Message rate 5x higher than historical average │ ││
|
||
│ │ │ Pattern: Sudden spike, not gradual increase │ ││
|
||
│ │ │ Possible Causes: │ ││
|
||
│ │ │ • Flash sale or promotional event (85% confidence) │ ││
|
||
│ │ │ • Client retry storm (10% confidence) │ ││
|
||
│ │ │ • Data replay/migration (5% confidence) │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Impact: Consumer lag increasing, storage filling faster │ ││
|
||
│ │ │ AI Recommendation: Scale consumers + extend retention │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [View Details] [Apply Recommendation] [Acknowledge] [Snooze] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ ⚠️ WARNING: Schema Drift Detected 9:15 AM ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Stream: EVENTS │ ││
|
||
│ │ │ Detection: 12% of messages don't match registered schema │ ││
|
||
│ │ │ New fields found: ["device_os", "app_version", "experiment_id"] │ ││
|
||
│ │ │ Source: events.mobile.> subjects (mobile app v3.2.0) │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ AI Recommendation: Update schema to v4 with optional fields │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [View Schema Diff] [Auto-Generate Schema] [Acknowledge] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ 💡 Optimization Suggestions │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 📊 Stream: AUDIT_LOG Potential: High ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Observation: Stream has 95% read-to-write ratio │ ││
|
||
│ │ │ Current: 3 replicas, file storage │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Recommendation: Add read replicas for better read performance │ ││
|
||
│ │ │ Expected Impact: 40% reduction in read latency │ ││
|
||
│ │ │ Estimated Cost: +$50/month (additional storage) │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [Apply] [Schedule] [Dismiss] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ 📊 Consumer: notification-sender Potential: Medium ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Observation: Consumer processes 1 message at a time │ ││
|
||
│ │ │ Current: batch_size=1, max_ack_pending=1 │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Recommendation: Enable batch processing │ ││
|
||
│ │ │ Suggested Config: batch_size=100, max_ack_pending=500 │ ││
|
||
│ │ │ Expected Impact: 10x throughput improvement │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [Apply] [Test First] [Dismiss] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ 🔮 Predictive Analysis │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Capacity Forecast (Next 30 Days) ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Stream: ORDERS │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Storage Usage Prediction: │ ││
|
||
│ │ │ 100% ┤ ╭─────────────── │ ││
|
||
│ │ │ │ ╭──────╯ Projected │ ││
|
||
│ │ │ 75% ┤ ╭─────╯ │ ││
|
||
│ │ │ │ ╭──────╯ │ ││
|
||
│ │ │ 50% ┼───────────────╭─────╯ │ ││
|
||
│ │ │ │ ╭─────╯ Current │ ││
|
||
│ │ │ 25% ┤ ╭────╯ │ ││
|
||
│ │ │ └────╯───────────────────────────────────────────────────── │ ││
|
||
│ │ │ Now +7d +14d +21d +30d │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ ⚠️ Alert: Storage limit (100GB) will be reached in ~18 days │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Recommendations: │ ││
|
||
│ │ │ 1. Increase maxBytes to 200GB │ ││
|
||
│ │ │ 2. Reduce retention from 30d to 14d │ ││
|
||
│ │ │ 3. Enable compression (est. 40% reduction) │ ││
|
||
│ │ │ │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 6.3 AI Message Analysis
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI MESSAGE ANALYZER │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Message Analysis: ORDERS Stream [🤖 AI Mode] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Structure Analysis] [Content Patterns] [Anomaly Detection] [Search] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ AI-Inferred Schema │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Based on analysis of 10,000 sample messages: ││
|
||
│ │ ││
|
||
│ │ { ││
|
||
│ │ "order_id": "string (pattern: ORD-\\d{4}-[A-Z0-9]{8})", ││
|
||
│ │ "customer_id": "string (UUID format)", ││
|
||
│ │ "amount": "number (range: 0.01 - 99999.99)", ││
|
||
│ │ "currency": "string (enum: USD, EUR, GBP, JPY)", ││
|
||
│ │ "status": "string (enum: pending, confirmed, shipped, delivered)", ││
|
||
│ │ "items": [{ ││
|
||
│ │ "sku": "string (pattern: SKU-\\d{3})", ││
|
||
│ │ "quantity": "integer (range: 1 - 100)", ││
|
||
│ │ "price": "number" ││
|
||
│ │ }], ││
|
||
│ │ "metadata": { ││
|
||
│ │ "source": "string (enum: web, mobile, api)", ││
|
||
│ │ "ip_address": "string (IP format, nullable)", ││
|
||
│ │ "user_agent": "string (nullable)" ││
|
||
│ │ }, ││
|
||
│ │ "created_at": "string (ISO 8601 datetime)" ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ │ Confidence: 98.5% ││
|
||
│ │ Coverage: 99.2% of messages match this schema ││
|
||
│ │ ││
|
||
│ │ [Register as Schema] [Export Avro] [Export JSON Schema] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Content Pattern Analysis │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Field Distribution Analysis ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ currency: source: ││
|
||
│ │ ┌────────────────────────┐ ┌────────────────────────┐ ││
|
||
│ │ │ USD ██████████████ 65%│ │ web █████████████ 58%│ ││
|
||
│ │ │ EUR █████░░░░░░░░ 22%│ │ mobile ██████░░░░░░ 32%│ ││
|
||
│ │ │ GBP ██░░░░░░░░░░░ 8% │ │ api ██░░░░░░░░░░ 10%│ ││
|
||
│ │ │ JPY █░░░░░░░░░░░░ 5% │ └────────────────────────┘ ││
|
||
│ │ └────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Amount Distribution: ││
|
||
│ │ ┌────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ │ ╭──╮ │ ││
|
||
│ │ │ │ ╭───╯ ╰──╮ │ ││
|
||
│ │ │ │ ╭─╯ ╰───╮ │ ││
|
||
│ │ │ ├─╯ ╰────╮ │ ││
|
||
│ │ │ │ ╰─────────────────────────────────── │ ││
|
||
│ │ │ └───────────────────────────────────────────────────────── │ ││
|
||
│ │ │ $0 $50 $100 $200 $500 $1000 $5000+ │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Mean: $127.45 │ Median: $85.00 │ P95: $450.00 │ P99: $1,200 │ ││
|
||
│ │ └────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Natural Language Search │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Search: [Find orders over $500 from mobile with shipping errors ] ││
|
||
│ │ ││
|
||
│ │ AI-Generated Query: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ $.amount > 500 │ ││
|
||
│ │ │ AND $.metadata.source = 'mobile' │ ││
|
||
│ │ │ AND $.status = 'error' │ ││
|
||
│ │ │ AND $.error_type CONTAINS 'shipping' │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Results: 234 messages found [Execute Search] ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 6.4 AI Query Generator
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI QUERY & CONFIG GENERATOR │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
NATURAL LANGUAGE TO CONFIG
|
||
──────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ AI Configuration Generator │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Describe what you want to create: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ I need a stream for storing user activity events. It should keep ││
|
||
│ │ events for 30 days, handle about 10,000 events per second, and be ││
|
||
│ │ highly available. Events should be partitioned by user_id for ││
|
||
│ │ ordering. I also need a consumer that processes events in batches ││
|
||
│ │ of 100 with at-least-once delivery. ││
|
||
│ │ ││
|
||
│ │ [Generate]││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Generated Configuration │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Stream: USER_ACTIVITY ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ // AI Explanation: ││
|
||
│ │ // - File storage for durability at high volume ││
|
||
│ │ // - 3 replicas for high availability ││
|
||
│ │ // - maxMsgsPerSubject limits per-user storage ││
|
||
│ │ // - S2 compression for 40-60% storage savings ││
|
||
│ │ ││
|
||
│ │ { ││
|
||
│ │ "name": "USER_ACTIVITY", ││
|
||
│ │ "subjects": ["activity.>"], ││
|
||
│ │ "retention": "limits", ││
|
||
│ │ "storage": "file", ││
|
||
│ │ "maxAge": "720h", // 30 days ││
|
||
│ │ "maxBytes": 500000000000, // 500GB for ~10K/sec ││
|
||
│ │ "maxMsgsPerSubject": 1000000, // Per user_id limit ││
|
||
│ │ "replicas": 3, ││
|
||
│ │ "compression": "s2", ││
|
||
│ │ "discard": "old", ││
|
||
│ │ "duplicateWindow": "120s", ││
|
||
│ │ "placement": { ││
|
||
│ │ "tags": ["ssd", "high-iops"] ││
|
||
│ │ } ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ │ Consumer: activity-processor ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ // AI Explanation: ││
|
||
│ │ // - Pull-based for batch processing ││
|
||
│ │ // - max_batch: 100 as requested ││
|
||
│ │ // - ack_wait: 30s for batch processing time ││
|
||
│ │ // - max_deliver: 5 for at-least-once with retries ││
|
||
│ │ ││
|
||
│ │ { ││
|
||
│ │ "name": "activity-processor", ││
|
||
│ │ "durable_name": "activity-processor", ││
|
||
│ │ "deliver_policy": "all", ││
|
||
│ │ "ack_policy": "explicit", ││
|
||
│ │ "ack_wait": "30s", ││
|
||
│ │ "max_deliver": 5, ││
|
||
│ │ "max_ack_pending": 1000, ││
|
||
│ │ "max_batch": 100, ││
|
||
│ │ "max_waiting": 512 ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Estimated Resources │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Storage (30 days): ~350 GB (with compression) ││
|
||
│ │ Memory: ~2 GB per replica for indexes ││
|
||
│ │ Bandwidth: ~50 MB/sec sustained ││
|
||
│ │ Cost Estimate: ~$150/month (based on current cluster pricing) ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ [Edit Config] [Create Stream & Consumer] [Save as Template] [Export] │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Self-Service Portal & Quotas
|
||
|
||
### 7.1 Team Self-Service
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ SELF-SERVICE PORTAL │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
NAMESPACE / TEAM MANAGEMENT
|
||
───────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Team: Payments Engineering [Settings] │
|
||
│ Namespace: payments-* │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ [Overview] [Streams] [Consumers] [Quotas] [Members] [Audit Log] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ Resource Usage │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Streams Storage Messages ││
|
||
│ │ ┌───────────────────┐ ┌───────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ 8 / 15 │ │ 45 GB / 100 GB │ │ 125M / 500M │ ││
|
||
│ │ │ ████████░░░░░░░ │ │ ████████░░░░░░░ │ │ █████░░░░░░░░░ │ ││
|
||
│ │ │ 53% │ │ 45% │ │ 25% │ ││
|
||
│ │ └───────────────────┘ └───────────────────┘ └─────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Consumers Throughput (In) Throughput (Out) ││
|
||
│ │ ┌───────────────────┐ ┌───────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ 24 / 50 │ │ 5K/s / 10K/s │ │ 8K/s / 20K/s │ ││
|
||
│ │ │ █████████░░░░░░ │ │ █████████░░░░░░ │ │ ████████░░░░░░ │ ││
|
||
│ │ │ 48% │ │ 50% │ │ 40% │ ││
|
||
│ │ └───────────────────┘ └───────────────────┘ └─────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ My Resources [+ Create] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Stream │ Storage │ Consumers │ Rate │ Status ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ payments-transactions│ 23.4 GB │ 8 │ 2.3K/s │ ● Active ││
|
||
│ │ payments-refunds │ 5.2 GB │ 4 │ 450/s │ ● Active ││
|
||
│ │ payments-audit │ 12.1 GB │ 2 │ 890/s │ ● Active ││
|
||
│ │ payments-dlq │ 234 MB │ 1 │ 12/s │ ⚠️ Needs Review ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Quick Actions │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ [📦 New Stream] [👤 Add Consumer] [📊 View Metrics] [📋 Templates] ││
|
||
│ │ ││
|
||
│ │ [🔑 API Keys] [📜 View Audit] [📈 Request Quota] [❓ Help] ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
QUOTA MANAGEMENT
|
||
────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Quota Management: Payments Engineering │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Current Quotas │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Resource │ Current │ Limit │ Usage │ Status ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Streams │ 8 │ 15 │ 53% │ ● OK ││
|
||
│ │ Consumers │ 24 │ 50 │ 48% │ ● OK ││
|
||
│ │ Total Storage │ 45 GB │ 100 GB │ 45% │ ● OK ││
|
||
│ │ Message Count │ 125M │ 500M │ 25% │ ● OK ││
|
||
│ │ Inbound Rate │ 5K/s │ 10K/s │ 50% │ ● OK ││
|
||
│ │ Outbound Rate │ 8K/s │ 20K/s │ 40% │ ● OK ││
|
||
│ │ Max Msg Size │ - │ 8 MB │ - │ ● OK ││
|
||
│ │ Replicas (max) │ - │ 3 │ - │ ● OK ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Request Quota Increase │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Resource: [Storage ▼] ││
|
||
│ │ Current Limit: 100 GB ││
|
||
│ │ Requested Limit: [200 ] GB ││
|
||
│ │ ││
|
||
│ │ Justification: ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ We're onboarding 3 new payment processors next month which will │ ││
|
||
│ │ │ increase our transaction volume by approximately 2x. Our │ ││
|
||
│ │ │ current growth rate suggests we'll hit 100GB within 6 weeks. │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ Estimated Cost Impact: +$25/month ││
|
||
│ │ Approval Required: Platform Admin (auto-approved under 500GB) ││
|
||
│ │ ││
|
||
│ │ [Cancel] [Submit Request] ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Quota History │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ 2024-01-10 │ Storage increased 50GB → 100GB │ Approved │ jane@acme ││
|
||
│ │ 2023-12-15 │ Streams increased 10 → 15 │ Approved │ platform-adm ││
|
||
│ │ 2023-11-01 │ Initial allocation │ Created │ system ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 7.2 Approval Workflows
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ APPROVAL WORKFLOW SYSTEM │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
PENDING APPROVALS
|
||
─────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Approval Queue [My Requests] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Pending Approvals (5) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 🟡 Production Stream Creation Submitted 2h ago ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Requester: john.doe@acme.com (Payments Team) │ ││
|
||
│ │ │ Type: Create Stream │ ││
|
||
│ │ │ Environment: Production │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Request Details: │ ││
|
||
│ │ │ • Stream Name: payments-settlements │ ││
|
||
│ │ │ • Storage: 50GB, File-based, 3 replicas │ ││
|
||
│ │ │ • Retention: 90 days │ ││
|
||
│ │ │ • Subjects: payments.settlements.> │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ AI Risk Assessment: ● Low │ ││
|
||
│ │ │ • Configuration follows team patterns │ ││
|
||
│ │ │ • Within quota limits │ ││
|
||
│ │ │ • Similar to existing approved streams │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [View Full Config] │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [Approve] [Approve with Changes] [Reject] [Request More Info] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ 🟡 Quota Increase Request Submitted 1d ago ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Requester: jane.smith@acme.com (Analytics Team) │ ││
|
||
│ │ │ Type: Quota Increase │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Request Details: │ ││
|
||
│ │ │ • Resource: Total Storage │ ││
|
||
│ │ │ • Current: 100 GB → Requested: 500 GB │ ││
|
||
│ │ │ • Justification: "New real-time analytics pipeline requires..." │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ AI Risk Assessment: ⚠️ Medium │ ││
|
||
│ │ │ • 5x increase is significant │ ││
|
||
│ │ │ • Cost impact: +$200/month │ ││
|
||
│ │ │ • Recommend reviewing retention policies first │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [View Usage History] [View Cost Impact] │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ [Approve] [Approve Partial (200GB)] [Reject] [Request Meeting] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
POLICY CONFIGURATION
|
||
────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Approval Policies [+ Add Policy] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Policy: Production Changes [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ Triggers: ││
|
||
│ │ • Any stream/consumer operation in production cluster ││
|
||
│ │ • Excludes: Read operations, message publishing ││
|
||
│ │ ││
|
||
│ │ Approval Requirements: ││
|
||
│ │ • 1 approval from: Platform Team OR Team Lead ││
|
||
│ │ • Auto-approve if: Change is < 10% of current limits ││
|
||
│ │ • Auto-reject if: Violates org security policies ││
|
||
│ │ ││
|
||
│ │ SLA: 4 hours (business hours) ││
|
||
│ │ Escalation: After 8 hours → notify @platform-oncall ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Policy: Large Quota Requests [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ Triggers: ││
|
||
│ │ • Quota increase > 2x current limit ││
|
||
│ │ • Storage increase > 100GB ││
|
||
│ │ • Cost impact > $100/month ││
|
||
│ │ ││
|
||
│ │ Approval Requirements: ││
|
||
│ │ • 1 approval from: Platform Admin ││
|
||
│ │ • 1 approval from: Finance (if cost > $500/month) ││
|
||
│ │ ││
|
||
│ │ SLA: 24 hours ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Policy: Development Self-Service [Enabled] [Edit] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ ││
|
||
│ │ Triggers: ││
|
||
│ │ • Any operation in development/staging clusters ││
|
||
│ │ ││
|
||
│ │ Approval Requirements: ││
|
||
│ │ • Auto-approve all requests within team quota ││
|
||
│ │ • Log for audit purposes ││
|
||
│ │ ││
|
||
│ │ SLA: Immediate ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 8. GitOps & Infrastructure as Code
|
||
|
||
### 8.1 GitOps Integration
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ GITOPS INTEGRATION │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
GITOPS ARCHITECTURE
|
||
───────────────────
|
||
|
||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ Git Repository NATS Console NATS Cluster │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
|
||
│ │ │ ───watch──► │ GitOps │ ──sync─► │ ││
|
||
│ │ YAML/JSON │ │ Controller │ │ JetStream ││
|
||
│ │ Configs │ │ │ │ ││
|
||
│ │ │ ◄───plan─── │ Drift │ ◄──read─ │ ││
|
||
│ └──────────────┘ │ Detector │ └──────────────┘│
|
||
│ │ └──────────────┘ │
|
||
│ │ │ │
|
||
│ ┌──────▼──────┐ ┌──────▼──────┐ │
|
||
│ │ CI/CD │ │ Audit │ │
|
||
│ │ Pipeline │ │ Log │ │
|
||
│ │ │ │ │ │
|
||
│ │ • Validate │ │ • Changes │ │
|
||
│ │ • Plan │ │ • Diffs │ │
|
||
│ │ • Apply │ │ • Approvals │ │
|
||
│ └─────────────┘ └─────────────┘ │
|
||
│ │
|
||
└──────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
REPOSITORY STRUCTURE
|
||
────────────────────
|
||
|
||
nats-config/
|
||
├── environments/
|
||
│ ├── production/
|
||
│ │ ├── clusters/
|
||
│ │ │ ├── us-east.yaml
|
||
│ │ │ └── eu-west.yaml
|
||
│ │ ├── streams/
|
||
│ │ │ ├── orders.yaml
|
||
│ │ │ ├── events.yaml
|
||
│ │ │ └── audit.yaml
|
||
│ │ ├── consumers/
|
||
│ │ │ ├── order-processor.yaml
|
||
│ │ │ └── analytics-worker.yaml
|
||
│ │ └── policies/
|
||
│ │ ├── quotas.yaml
|
||
│ │ └── retention.yaml
|
||
│ ├── staging/
|
||
│ │ └── ...
|
||
│ └── development/
|
||
│ └── ...
|
||
├── schemas/
|
||
│ ├── order.avsc
|
||
│ ├── event.json
|
||
│ └── customer.proto
|
||
├── workflows/
|
||
│ ├── order-pipeline.yaml
|
||
│ └── analytics-pipeline.yaml
|
||
└── kustomization.yaml
|
||
|
||
|
||
CONFIGURATION FILE FORMAT
|
||
─────────────────────────
|
||
|
||
# streams/orders.yaml
|
||
apiVersion: nats.io/v1
|
||
kind: Stream
|
||
metadata:
|
||
name: ORDERS
|
||
namespace: payments
|
||
labels:
|
||
team: payments
|
||
env: production
|
||
tier: critical
|
||
spec:
|
||
description: "Customer order events"
|
||
subjects:
|
||
- "orders.>"
|
||
retention: limits
|
||
storage: file
|
||
maxBytes: 107374182400 # 100GB
|
||
maxAge: 168h # 7 days
|
||
maxMsgSize: 8388608 # 8MB
|
||
replicas: 3
|
||
compression: s2
|
||
discard: old
|
||
duplicateWindow: 5m
|
||
placement:
|
||
tags:
|
||
- ssd
|
||
- us-east
|
||
mirror: null
|
||
sources: []
|
||
|
||
# Schema enforcement
|
||
schema:
|
||
type: avro
|
||
ref: schemas/order.avsc
|
||
validation: strict
|
||
|
||
# Consumers defined inline or separately
|
||
consumers:
|
||
- name: order-processor
|
||
durableName: order-processor
|
||
deliverPolicy: all
|
||
ackPolicy: explicit
|
||
ackWait: 30s
|
||
maxDeliver: 5
|
||
maxAckPending: 1000
|
||
filterSubject: "orders.created.>"
|
||
|
||
|
||
GITOPS DASHBOARD
|
||
────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ GitOps: Infrastructure as Code │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Repository: github.com/acme/nats-config [⟳ Sync Now] │
|
||
│ Branch: main │ Last sync: 5 min ago │ Status: ● In Sync │
|
||
│ │
|
||
│ [Sync Status] [Diff View] [History] [Settings] │
|
||
│ ══════════════════════════════════════════════════════════════════════════ │
|
||
│ │
|
||
│ Environment Status │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Environment │ Resources │ Synced │ Drift │ Last Sync │ Status ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ production │ 45 │ 45 │ 0 │ 5m ago │ ● In Sync ││
|
||
│ │ staging │ 38 │ 36 │ 2 │ 12m ago │ ⚠️ Drift ││
|
||
│ │ development │ 52 │ 52 │ 0 │ 2m ago │ ● In Sync ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Detected Drift (staging) [Auto-Remediate] │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Stream: EVENTS ││
|
||
│ │ ┌───────────────────────────────────────────────────────────────────┐ ││
|
||
│ │ │ Field │ Git (Expected) │ Actual │ Action │ ││
|
||
│ │ │ ─────────────────────────────────────────────────────────────── │ ││
|
||
│ │ │ maxBytes │ 50GB │ 100GB │ [Revert] │ ││
|
||
│ │ │ replicas │ 2 │ 3 │ [Revert] │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Manual change detected at 2024-01-15 09:23 by john@acme.com │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ Options: [Revert to Git] [Update Git from Cluster] [Ignore] │ ││
|
||
│ │ └───────────────────────────────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Recent Syncs │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Commit │ Author │ Changes │ Status │ Time ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ a3f2d1c │ jane@acme │ +2 streams │ ✅ Applied │ 5m ago ││
|
||
│ │ b4e5c2a │ bob@acme │ Update consumers │ ✅ Applied │ 2h ago ││
|
||
│ │ c5d6e3b │ alice@acme │ New workflow │ ✅ Applied │ 1d ago ││
|
||
│ │ d6e7f4c │ john@acme │ Quota increase │ ⏳ Pending │ 1d ago ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 8.2 Terraform Provider
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ TERRAFORM PROVIDER DESIGN │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
TERRAFORM RESOURCE EXAMPLES
|
||
───────────────────────────
|
||
|
||
# Provider configuration
|
||
provider "nats" {
|
||
endpoint = "https://console.nats.acme.com"
|
||
api_key = var.nats_api_key
|
||
|
||
# Optional: specific cluster
|
||
cluster_id = "prod-us-east"
|
||
}
|
||
|
||
# Stream resource
|
||
resource "nats_stream" "orders" {
|
||
name = "ORDERS"
|
||
description = "Customer order events"
|
||
|
||
subjects = ["orders.>"]
|
||
|
||
retention = "limits"
|
||
storage = "file"
|
||
|
||
max_bytes = 107374182400 # 100GB
|
||
max_age = "168h" # 7 days
|
||
max_msg_size = 8388608 # 8MB
|
||
max_msgs = -1 # unlimited
|
||
|
||
replicas = 3
|
||
compression = "s2"
|
||
discard = "old"
|
||
|
||
duplicate_window = "5m"
|
||
|
||
placement {
|
||
tags = ["ssd", "us-east"]
|
||
}
|
||
|
||
# Schema enforcement
|
||
schema {
|
||
type = "avro"
|
||
schema_id = nats_schema.order.id
|
||
validation = "strict"
|
||
}
|
||
|
||
labels = {
|
||
team = "payments"
|
||
tier = "critical"
|
||
}
|
||
}
|
||
|
||
# Consumer resource
|
||
resource "nats_consumer" "order_processor" {
|
||
stream_name = nats_stream.orders.name
|
||
|
||
name = "order-processor"
|
||
durable_name = "order-processor"
|
||
|
||
deliver_policy = "all"
|
||
ack_policy = "explicit"
|
||
ack_wait = "30s"
|
||
max_deliver = 5
|
||
max_ack_pending = 1000
|
||
|
||
filter_subject = "orders.created.>"
|
||
|
||
# Push delivery (optional)
|
||
# deliver_subject = "deliver.order-processor"
|
||
|
||
# Rate limiting
|
||
rate_limit = 1000 # msgs per second
|
||
}
|
||
|
||
# Schema resource
|
||
resource "nats_schema" "order" {
|
||
name = "Order"
|
||
namespace = "io.acme.orders"
|
||
type = "avro"
|
||
|
||
compatibility = "backward"
|
||
|
||
schema = file("${path.module}/schemas/order.avsc")
|
||
}
|
||
|
||
# KV Store resource
|
||
resource "nats_kv_bucket" "customer_cache" {
|
||
bucket = "customer-cache"
|
||
description = "Customer data cache"
|
||
|
||
max_value_size = 102400 # 100KB
|
||
history = 5
|
||
ttl = "24h"
|
||
|
||
replicas = 3
|
||
storage = "file"
|
||
}
|
||
|
||
# Alert rule resource
|
||
resource "nats_alert_rule" "high_lag" {
|
||
name = "High Consumer Lag Alert"
|
||
severity = "critical"
|
||
|
||
condition {
|
||
metric = "consumer_lag"
|
||
stream = nats_stream.orders.name
|
||
consumer = nats_consumer.order_processor.name
|
||
operator = ">"
|
||
threshold = 10000
|
||
duration = "5m"
|
||
}
|
||
|
||
notification {
|
||
channel = "slack"
|
||
target = "#alerts-critical"
|
||
}
|
||
|
||
notification {
|
||
channel = "pagerduty"
|
||
target = "payments-oncall"
|
||
}
|
||
}
|
||
|
||
# Workflow/Pipeline resource
|
||
resource "nats_workflow" "order_pipeline" {
|
||
name = "Order Processing Pipeline"
|
||
description = "Enriches and routes orders"
|
||
|
||
enabled = true
|
||
|
||
trigger {
|
||
type = "stream"
|
||
stream = nats_stream.orders.name
|
||
filter = "orders.created.>"
|
||
}
|
||
|
||
pipeline = file("${path.module}/workflows/order-pipeline.json")
|
||
|
||
error_handling {
|
||
max_retries = 3
|
||
dlq_stream = nats_stream.orders_dlq.name
|
||
}
|
||
}
|
||
|
||
|
||
TERRAFORM IMPORT SUPPORT
|
||
────────────────────────
|
||
|
||
# Import existing resources
|
||
terraform import nats_stream.orders ORDERS
|
||
terraform import nats_consumer.order_processor ORDERS/order-processor
|
||
terraform import nats_schema.order Order
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Advanced Observability
|
||
|
||
### 9.1 Distributed Tracing
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DISTRIBUTED TRACING VIEW │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
MESSAGE TRACE VISUALIZATION
|
||
───────────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Message Trace: orders.created (Seq: 15234567) [Export Trace] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Trace ID: abc-123-def-456 Total Duration: 234ms │
|
||
│ Start: 2024-01-15 10:45:23.456 UTC Services: 5 │
|
||
│ │
|
||
│ Waterfall View │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Service │ Operation │ Duration │ Timeline ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ │ │ │ 0ms 250ms ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ order-api │ publish │ 12ms │ ██░░░░░░░░░░ ││
|
||
│ │ └─ NATS │ stream.write │ 3ms │ █░░░░░░░░░░░ ││
|
||
│ │ │ │ │ ││
|
||
│ │ order-processor │ consume │ 145ms │ ░░████████░░ ││
|
||
│ │ ├─ validate │ schema.validate │ 5ms │ ░░█░░░░░░░░░ ││
|
||
│ │ ├─ customer-svc │ http.get │ 45ms │ ░░░██░░░░░░░ ││
|
||
│ │ ├─ inventory-svc │ http.get │ 62ms │ ░░░░███░░░░░ ││
|
||
│ │ ├─ process │ business.logic │ 23ms │ ░░░░░░░█░░░░ ││
|
||
│ │ └─ NATS │ stream.publish │ 8ms │ ░░░░░░░░█░░░ ││
|
||
│ │ │ │ │ ││
|
||
│ │ notification-svc │ consume │ 45ms │ ░░░░░░░░░██░ ││
|
||
│ │ └─ email-provider │ http.post │ 38ms │ ░░░░░░░░░██░ ││
|
||
│ │ │ │ │ ││
|
||
│ │ analytics-worker │ consume │ 23ms │ ░░░░░░░░░░██ ││
|
||
│ │ └─ clickhouse │ db.insert │ 15ms │ ░░░░░░░░░░█░ ││
|
||
│ │ │ │ │ ││
|
||
│ │ audit-logger │ consume │ 18ms │ ░░░░░░░░░░░█ ││
|
||
│ │ └─ clickhouse │ db.insert │ 12ms │ ░░░░░░░░░░░█ ││
|
||
│ │ │ │ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Message Flow Diagram │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────────────┐ ││
|
||
│ │ │order-api │─────►│ ORDERS │─────►│ order-processor │ ││
|
||
│ │ └──────────┘ │ stream │ │ (145ms, ✅ success) │ ││
|
||
│ │ └──────────┘ └────────────┬─────────────┘ ││
|
||
│ │ │ ││
|
||
│ │ ┌────────────┴────────────┐ ││
|
||
│ │ │ │ ││
|
||
│ │ ▼ ▼ ││
|
||
│ │ ┌──────────────────────────┐ ┌──────────────────┐ ││
|
||
│ │ │ ORDERS_PROCESSED stream │ │ NOTIFICATIONS │ ││
|
||
│ │ └────────────┬─────────────┘ │ stream │ ││
|
||
│ │ │ └────────┬─────────┘ ││
|
||
│ │ ┌────────────┴────────┐ │ ││
|
||
│ │ │ │ ▼ ││
|
||
│ │ ▼ ▼ ┌──────────────────┐ ││
|
||
│ │ ┌──────────────────┐ ┌──────────────┐ │notification-svc │ ││
|
||
│ │ │analytics-worker │ │audit-logger │ │(45ms, ✅) │ ││
|
||
│ │ │(23ms, ✅) │ │(18ms, ✅) │ └──────────────────┘ ││
|
||
│ │ └──────────────────┘ └──────────────┘ ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Span Details: order-processor │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Tags: ││
|
||
│ │ service: order-processor version: v2.3.1 ││
|
||
│ │ pod: order-processor-7d8c node: k8s-node-03 ││
|
||
│ │ nats.stream: ORDERS nats.sequence: 15234567 ││
|
||
│ │ ││
|
||
│ │ Events: ││
|
||
│ │ 10:45:23.468 message.received ││
|
||
│ │ 10:45:23.473 schema.validated ││
|
||
│ │ 10:45:23.518 customer.fetched customer_id=CUST-456 ││
|
||
│ │ 10:45:23.580 inventory.checked sku_count=3 ││
|
||
│ │ 10:45:23.603 order.processed status=confirmed ││
|
||
│ │ 10:45:23.611 message.published to=ORDERS_PROCESSED ││
|
||
│ │ 10:45:23.613 message.acked ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 9.2 Custom Dashboards
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CUSTOM DASHBOARD BUILDER │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Dashboard: Payments Overview [Edit] [Share] [⋮] │
|
||
│ Auto-refresh: 30s │ Time range: Last 6 hours │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌────────────────────────┐ ┌────────────────────────┐ ┌───────────────────┐│
|
||
│ │ Transaction Rate │ │ Success Rate │ │ Avg Latency ││
|
||
│ │ ═══════════════════ │ │ ═══════════════════ │ │ ═══════════════ ││
|
||
│ │ │ │ │ │ ││
|
||
│ │ 2,345 /sec │ │ 99.7% │ │ 45 ms ││
|
||
│ │ ↑ 12% vs avg │ │ ↓ 0.1% │ │ ↓ 5ms ││
|
||
│ │ │ │ │ │ ││
|
||
│ └────────────────────────┘ └────────────────────────┘ └───────────────────┘│
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Transaction Volume by Region ││
|
||
│ │ ════════════════════════════════════════════════════════════════════ ││
|
||
│ │ ││
|
||
│ │ 3K ┤ ╭────╮ ╭────╮ ││
|
||
│ │ │ ╭────╯ ╰────╮ ╭────╯ ╰────╮ ││
|
||
│ │ 2K ┤ ╭────╯ ╰────╮ ╭────╯ ╰─── ││
|
||
│ │ │ ╭────╯ ╰─╯ ││
|
||
│ │ 1K ┼─────╯ ││
|
||
│ │ │ ││
|
||
│ │ 0 ┼───────────────────────────────────────────────────────────────── ││
|
||
│ │ 04:00 06:00 08:00 10:00 Now ││
|
||
│ │ ││
|
||
│ │ ── us-east ── us-west ── eu-west ── ap-south ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌──────────────────────────────────┐ ┌─────────────────────────────────────┐│
|
||
│ │ Consumer Health │ │ Top Errors ││
|
||
│ │ ═══════════════════════════════ │ │ ═══════════════════════════════ ││
|
||
│ │ │ │ ││
|
||
│ │ payment-processor ● Healthy │ │ ValidationError ████████ 68% ││
|
||
│ │ Lag: 234 Rate: 1.2K/s │ │ TimeoutError ███░░░░░ 22% ││
|
||
│ │ │ │ NetworkError █░░░░░░░ 7% ││
|
||
│ │ fraud-detector ● Healthy │ │ SchemaError █░░░░░░░ 3% ││
|
||
│ │ Lag: 45 Rate: 890/s │ │ ││
|
||
│ │ │ │ Total Errors: 234 (0.3%) ││
|
||
│ │ settlement-worker ⚠️ Warning │ │ ││
|
||
│ │ Lag: 5,234 Rate: 450/s │ │ ││
|
||
│ │ │ │ ││
|
||
│ └──────────────────────────────────┘ └─────────────────────────────────────┘│
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Recent Alerts ││
|
||
│ │ ════════════════════════════════════════════════════════════════════ ││
|
||
│ │ ││
|
||
│ │ ⚠️ 10:32 Consumer lag threshold exceeded (settlement-worker) ││
|
||
│ │ ● 09:15 Alert resolved: High error rate returned to normal ││
|
||
│ │ ⚠️ 08:45 Storage usage above 80% (payments-audit stream) ││
|
||
│ │ ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Data Lineage & Catalog
|
||
|
||
### 10.1 Data Lineage Visualization
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DATA LINEAGE & CATALOG │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
END-TO-END LINEAGE VIEW
|
||
───────────────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Data Lineage: Order Event [Expand All] [⬇️] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Trace the journey of data from source to destination │
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ DATA SOURCES ││
|
||
│ │ ┌─────────────────┐ ││
|
||
│ │ │ 🌐 Order API │ ││
|
||
│ │ │ (REST) │ ││
|
||
│ │ └────────┬────────┘ ││
|
||
│ │ │ ││
|
||
│ │ ▼ ││
|
||
│ │ INGESTION LAYER ││
|
||
│ │ ┌─────────────────┐ ││
|
||
│ │ │ 📥 ORDERS │ ││
|
||
│ │ │ Stream │ ││
|
||
│ │ │ (Raw Events) │ ││
|
||
│ │ └────────┬────────┘ ││
|
||
│ │ │ ││
|
||
│ │ ┌────────┴────────────────────────────────────────────────────┐ ││
|
||
│ │ │ │ ││
|
||
│ │ ▼ ▼ ││
|
||
│ │ PROCESSING LAYER ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ ⚙️ Enrichment │ │ ⚙️ Validation │ │ ⚙️ Fan-out │ ││
|
||
│ │ │ Pipeline │ │ Service │ │ Router │ ││
|
||
│ │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ ││
|
||
│ │ │ │ │ ││
|
||
│ │ ▼ ▼ ▼ ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ 📦 ORDERS_ │ │ 📦 ORDERS_DLQ │ │ 📦 ORDERS_US │ ││
|
||
│ │ │ ENRICHED │ │ (Failures) │ │ ORDERS_EU │ ││
|
||
│ │ └────────┬────────┘ └─────────────────┘ │ ORDERS_APAC │ ││
|
||
│ │ │ └────────┬────────┘ ││
|
||
│ │ ┌────────┴────────────────────────────────────────────────┐ ││
|
||
│ │ │ │ │ ││
|
||
│ │ ▼ ▼ ▼ ││
|
||
│ │ CONSUMPTION LAYER ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ 👤 order- │ │ 👤 analytics- │ │ 👤 notification-│ ││
|
||
│ │ │ processor │ │ worker │ │ service │ ││
|
||
│ │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ ││
|
||
│ │ │ │ │ ││
|
||
│ │ ▼ ▼ ▼ ││
|
||
│ │ DESTINATION LAYER ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ 🗄️ PostgreSQL │ │ 🗄️ ClickHouse │ │ 📧 Email/SMS │ ││
|
||
│ │ │ (Orders DB) │ │ (Analytics) │ │ Providers │ ││
|
||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ││
|
||
│ │ ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Impact Analysis: What happens if ORDERS stream schema changes? │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Downstream Impact: ││
|
||
│ │ • 3 processing pipelines (Enrichment, Validation, Fan-out) ││
|
||
│ │ • 4 consumer applications ││
|
||
│ │ • 5 destination systems ││
|
||
│ │ • ~15M messages/day affected ││
|
||
│ │ ││
|
||
│ │ Recommended Actions: ││
|
||
│ │ 1. Notify all downstream team owners (Payments, Analytics, Comms) ││
|
||
│ │ 2. Schedule maintenance window ││
|
||
│ │ 3. Run schema compatibility check ││
|
||
│ │ ││
|
||
│ │ [Generate Impact Report] [Notify Teams] [Schedule Change] ││
|
||
│ │ ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 10.2 Data Catalog
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DATA CATALOG │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Data Catalog [+ Add Entry] [Settings] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Search: [Search streams, subjects, schemas, fields... ] [🔍] │
|
||
│ │
|
||
│ Browse: [All ▼] [Production ▼] [Team: All ▼] [Tags: All ▼] │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ 📦 ORDERS [View Details] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Customer order events from e-commerce platform ││
|
||
│ │ ││
|
||
│ │ Owner: Payments Team │ Classification: PII, Financial ││
|
||
│ │ Environment: Production │ Quality Score: 98.5% ││
|
||
│ │ Schema: Order (v3) │ Last Updated: 2h ago ││
|
||
│ │ ││
|
||
│ │ Tags: [orders] [payments] [critical] [customer-data] ││
|
||
│ │ ││
|
||
│ │ Key Fields: ││
|
||
│ │ • order_id (string) - Unique order identifier ││
|
||
│ │ • customer_id (string) - Customer reference [PII] ││
|
||
│ │ • amount (decimal) - Order total [Financial] ││
|
||
│ │ • status (enum) - Order status ││
|
||
│ │ ││
|
||
│ │ Lineage: 1 source → 5 destinations ││
|
||
│ │ Usage: 15.2M msgs/day │ 12 consumers │ 3 workflows ││
|
||
│ │ ││
|
||
│ ├─────────────────────────────────────────────────────────────────────────┤│
|
||
│ │ ││
|
||
│ │ 📦 EVENTS [View Details] ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ Application events and user activity tracking ││
|
||
│ │ ││
|
||
│ │ Owner: Analytics Team │ Classification: User Activity ││
|
||
│ │ Environment: Production │ Quality Score: 99.1% ││
|
||
│ │ Schema: Event (v2) │ Last Updated: 30m ago ││
|
||
│ │ ││
|
||
│ │ Tags: [events] [analytics] [tracking] [mobile] [web] ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Catalog Statistics │
|
||
│ ┌────────────────────┐ ┌────────────────────┐ ┌─────────────────────┐ │
|
||
│ │ 24 Streams │ │ 156 Subjects │ │ 18 Schemas │ │
|
||
│ │ Documented │ │ Cataloged │ │ Registered │ │
|
||
│ └────────────────────┘ └────────────────────┘ └─────────────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 11. Disaster Recovery & Replication
|
||
|
||
### 11.1 DR Configuration
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DISASTER RECOVERY CONFIGURATION │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
DR TOPOLOGY
|
||
───────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Disaster Recovery: Global Replication │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌──────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ US-EAST (Primary) US-WEST (Hot Standby) ││
|
||
│ │ ┌─────────────────┐ ┌─────────────────┐ ││
|
||
│ │ │ ██████████████ │ ───sync────► │ ██████████████ │ ││
|
||
│ │ │ NATS Cluster │ (async) │ NATS Cluster │ ││
|
||
│ │ │ │ │ │ ││
|
||
│ │ │ • 3 nodes │ RPO: 5 sec │ • 3 nodes │ ││
|
||
│ │ │ • 24 streams │ RTO: 30 sec │ • 24 mirrors │ ││
|
||
│ │ │ • Active │ │ • Standby │ ││
|
||
│ │ └─────────────────┘ └─────────────────┘ ││
|
||
│ │ │ │ ││
|
||
│ │ │ │ ││
|
||
│ │ │ EU-WEST (DR Cold) │ ││
|
||
│ │ │ ┌─────────────────┐ │ ││
|
||
│ │ └──────────│ ░░░░░░░░░░░░░░ │◄─────┘ ││
|
||
│ │ sync │ NATS Cluster │ sync ││
|
||
│ │ (batch) │ │ (batch) ││
|
||
│ │ │ • 3 nodes │ ││
|
||
│ │ RPO: 1hr │ • Snapshots │ ││
|
||
│ │ RTO: 4hr │ • Cold │ ││
|
||
│ │ └─────────────────┘ ││
|
||
│ │ ││
|
||
│ └──────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Replication Status │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Source │ Target │ Type │ Lag │ Status │ Last Sync ││
|
||
│ │ ───────────────────────────────────────────────────────────────────── ││
|
||
│ │ US-EAST │ US-WEST │ Async │ 2 sec │ ● Synced │ Just now ││
|
||
│ │ US-EAST │ EU-WEST │ Batch │ 45 min │ ● Synced │ 45m ago ││
|
||
│ │ US-WEST │ EU-WEST │ Batch │ 50 min │ ● Synced │ 50m ago ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Failover Controls │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Current Primary: US-EAST ││
|
||
│ │ ││
|
||
│ │ [🔄 Failover to US-WEST] [⏸️ Pause Replication] [🔍 Test Failover] ││
|
||
│ │ ││
|
||
│ │ ⚠️ Failover will redirect all traffic to US-WEST within 30 seconds ││
|
||
│ │ Data loss risk: ~5 seconds (current replication lag) ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Backup & Snapshots │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ││
|
||
│ │ Scheduled Backups: ││
|
||
│ │ • Full backup: Daily at 02:00 UTC → S3 (retained 30 days) ││
|
||
│ │ • Incremental: Hourly → S3 (retained 7 days) ││
|
||
│ │ ││
|
||
│ │ Latest Backups: ││
|
||
│ │ │ Type │ Time │ Size │ Streams │ Status │ ││
|
||
│ │ │ Full │ 2024-01-15 02:00│ 45 GB │ 24 │ ✅ Verified │ ││
|
||
│ │ │ Incremental│ 2024-01-15 10:00│ 2.3 GB │ 24 │ ✅ Verified │ ││
|
||
│ │ │ Incremental│ 2024-01-15 09:00│ 1.8 GB │ 24 │ ✅ Verified │ ││
|
||
│ │ ││
|
||
│ │ [Create Manual Backup] [Restore from Backup] [Configure Schedule] ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 12. Developer Experience
|
||
|
||
### 12.1 SDK & Code Generation
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ DEVELOPER TOOLS & SDK │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CODE GENERATOR
|
||
──────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Code Generator │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Generate client code from your streams and schemas │
|
||
│ │
|
||
│ Stream: [ORDERS ▼] │
|
||
│ Language: [TypeScript ▼] [Python ▼] [Go ▼] [Java ▼] [C# ▼] │
|
||
│ │
|
||
│ Options: │
|
||
│ ☑️ Generate producer client │
|
||
│ ☑️ Generate consumer client │
|
||
│ ☑️ Generate schema types │
|
||
│ ☑️ Include validation │
|
||
│ ☐ Generate tests │
|
||
│ │
|
||
│ [Generate Code] │
|
||
│ │
|
||
│ Generated Code Preview (TypeScript) │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ // Auto-generated NATS client for ORDERS stream ││
|
||
│ │ // Generated at: 2024-01-15T10:45:00Z ││
|
||
│ │ ││
|
||
│ │ import { connect, JetStreamClient, NatsConnection } from 'nats'; ││
|
||
│ │ import { Order, OrderSchema } from './schemas/order'; ││
|
||
│ │ ││
|
||
│ │ export class OrdersProducer { ││
|
||
│ │ private js: JetStreamClient; ││
|
||
│ │ ││
|
||
│ │ constructor(private nc: NatsConnection) { ││
|
||
│ │ this.js = nc.jetstream(); ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ │ async publishOrderCreated(order: Order): Promise<void> { ││
|
||
│ │ // Validate against schema ││
|
||
│ │ const validated = OrderSchema.parse(order); ││
|
||
│ │ ││
|
||
│ │ await this.js.publish( ││
|
||
│ │ `orders.created.${order.region}`, ││
|
||
│ │ JSON.stringify(validated), ││
|
||
│ │ { ││
|
||
│ │ headers: { ││
|
||
│ │ 'Content-Type': 'application/json', ││
|
||
│ │ 'X-Schema-Version': '3', ││
|
||
│ │ } ││
|
||
│ │ } ││
|
||
│ │ ); ││
|
||
│ │ } ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ │ export class OrdersConsumer { ││
|
||
│ │ private js: JetStreamClient; ││
|
||
│ │ ││
|
||
│ │ async consume( ││
|
||
│ │ handler: (order: Order, ack: () => void) => Promise<void> ││
|
||
│ │ ): Promise<void> { ││
|
||
│ │ const consumer = await this.js.consumers.get('ORDERS', 'my-app'); ││
|
||
│ │ const messages = await consumer.consume(); ││
|
||
│ │ ││
|
||
│ │ for await (const msg of messages) { ││
|
||
│ │ const order = OrderSchema.parse(JSON.parse(msg.data)); ││
|
||
│ │ await handler(order, () => msg.ack()); ││
|
||
│ │ } ││
|
||
│ │ } ││
|
||
│ │ } ││
|
||
│ │ ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ [Copy to Clipboard] [Download as ZIP] [Push to GitHub] │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
|
||
API PLAYGROUND
|
||
──────────────
|
||
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ API Playground [Documentation] │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Test NATS operations directly from the browser │
|
||
│ │
|
||
│ Operation: [Publish Message ▼] │
|
||
│ │
|
||
│ Stream: [ORDERS ▼] │
|
||
│ Subject: [orders.created.us-east ] │
|
||
│ │
|
||
│ Headers: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ Content-Type: application/json [+ Add]││
|
||
│ │ X-Correlation-ID: test-123 [+ Add]││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ Payload: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ { ││
|
||
│ │ "order_id": "ORD-2024-TEST001", ││
|
||
│ │ "customer_id": "CUST-12345", ││
|
||
│ │ "amount": 299.99, ││
|
||
│ │ "currency": "USD", ││
|
||
│ │ "status": "pending", ││
|
||
│ │ "items": [ ││
|
||
│ │ { "sku": "SKU-001", "quantity": 2, "price": 149.99 } ││
|
||
│ │ ] ││
|
||
│ │ } ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
│ │
|
||
│ [Validate Schema] [Send Message] [Generate cURL] [Generate Code] │
|
||
│ │
|
||
│ Response: │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ ✅ Message published successfully ││
|
||
│ │ ││
|
||
│ │ Stream: ORDERS ││
|
||
│ │ Sequence: 15234568 ││
|
||
│ │ Timestamp: 2024-01-15T10:45:23.456Z ││
|
||
│ │ Duplicate: false ││
|
||
│ │ ││
|
||
│ │ Latency: 12ms ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 12.2 CLI Tool
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ CLI TOOL DESIGN │
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
CLI COMMAND STRUCTURE
|
||
─────────────────────
|
||
|
||
nats-console
|
||
├── auth
|
||
│ ├── login # Interactive login
|
||
│ ├── logout # Clear credentials
|
||
│ ├── status # Show auth status
|
||
│ └── token # Get/refresh token
|
||
├── cluster
|
||
│ ├── list # List all clusters
|
||
│ ├── info <name> # Cluster details
|
||
│ ├── health <name> # Health check
|
||
│ └── switch <name> # Switch active cluster
|
||
├── stream
|
||
│ ├── list # List streams
|
||
│ ├── create <name> # Create stream
|
||
│ ├── info <name> # Stream details
|
||
│ ├── update <name> # Update config
|
||
│ ├── delete <name> # Delete stream
|
||
│ ├── purge <name> # Purge messages
|
||
│ └── mirror <src> <dst> # Setup mirror
|
||
├── consumer
|
||
│ ├── list <stream> # List consumers
|
||
│ ├── create <stream> # Create consumer
|
||
│ ├── info <stream> <name> # Consumer details
|
||
│ ├── delete <stream> <name># Delete consumer
|
||
│ └── pause <stream> <name> # Pause consumer
|
||
├── message
|
||
│ ├── publish <subject> # Publish message
|
||
│ ├── get <stream> <seq> # Get message
|
||
│ ├── browse <stream> # Browse messages
|
||
│ └── replay <stream> # Replay messages
|
||
├── kv
|
||
│ ├── list # List KV buckets
|
||
│ ├── get <bucket> <key> # Get value
|
||
│ ├── put <bucket> <key> # Set value
|
||
│ ├── delete <bucket> <key> # Delete key
|
||
│ └── watch <bucket> # Watch changes
|
||
├── schema
|
||
│ ├── list # List schemas
|
||
│ ├── register <file> # Register schema
|
||
│ ├── validate <schema> <msg># Validate message
|
||
│ └── diff <v1> <v2> # Compare versions
|
||
├── workflow
|
||
│ ├── list # List workflows
|
||
│ ├── deploy <file> # Deploy workflow
|
||
│ ├── status <name> # Workflow status
|
||
│ └── logs <name> # Workflow logs
|
||
├── config
|
||
│ ├── export <stream> # Export to YAML
|
||
│ ├── import <file> # Import from YAML
|
||
│ ├── diff <file> # Show diff
|
||
│ └── apply <file> # Apply changes
|
||
└── ai
|
||
├── ask <question> # Ask AI assistant
|
||
├── diagnose <resource> # AI diagnostics
|
||
└── suggest <scenario> # Get suggestions
|
||
|
||
|
||
USAGE EXAMPLES
|
||
──────────────
|
||
|
||
# Login to console
|
||
$ nats-console auth login
|
||
? Email: user@acme.com
|
||
? Password: ********
|
||
✅ Logged in successfully
|
||
|
||
# List streams with details
|
||
$ nats-console stream list --format table
|
||
NAME MESSAGES STORAGE CONSUMERS STATUS
|
||
ORDERS 15.2M 2.3 GB 5 ● Healthy
|
||
EVENTS 89.5M 12.1 GB 12 ● Healthy
|
||
NOTIFICATIONS 5.8M 890 MB 3 ● Healthy
|
||
|
||
# Create stream from template
|
||
$ nats-console stream create payments-new \
|
||
--template work-queue \
|
||
--subjects "payments.>" \
|
||
--max-bytes 100GB \
|
||
--replicas 3
|
||
|
||
✅ Stream 'payments-new' created successfully
|
||
|
||
# Publish message
|
||
$ echo '{"order_id": "ORD-123"}' | nats-console message publish orders.created
|
||
|
||
# Browse messages interactively
|
||
$ nats-console message browse ORDERS --filter "orders.created.*" --last 10
|
||
|
||
# AI-powered diagnostics
|
||
$ nats-console ai diagnose order-processor
|
||
🤖 Analyzing consumer 'order-processor'...
|
||
|
||
Findings:
|
||
1. ⚠️ Consumer lag is 5,234 (above threshold of 1,000)
|
||
2. Processing rate decreased 40% in last hour
|
||
3. Correlated with increased DB latency
|
||
|
||
Recommendations:
|
||
1. Scale consumers from 3 to 6
|
||
2. Add connection pooling to database client
|
||
3. Enable batch processing (batch_size: 100)
|
||
|
||
Apply fix #1? [y/N]:
|
||
|
||
# Export configuration to Git
|
||
$ nats-console config export ORDERS --output ./streams/orders.yaml
|
||
✅ Exported to ./streams/orders.yaml
|
||
|
||
# Apply configuration from file
|
||
$ nats-console config apply ./streams/orders.yaml --dry-run
|
||
Changes to apply:
|
||
Stream: ORDERS
|
||
- maxBytes: 50GB → 100GB
|
||
- replicas: 2 → 3
|
||
|
||
Apply changes? [y/N]:
|
||
```
|
||
|
||
---
|
||
|
||
## Summary
|
||
|
||
This comprehensive design document covers all advanced capabilities for a modern NATS JetStream management console comparable to RedPanda Console, including:
|
||
|
||
1. **Advanced Stream Management** - Lifecycle, templates, subject hierarchies
|
||
2. **Consumer Orchestration** - Groups, autoscaling, DLQ management
|
||
3. **Message Workflows** - Visual pipeline builder, routing, transforms
|
||
4. **Schema Registry** - Evolution, compatibility, data quality
|
||
5. **Stream Processing** - Real-time transforms, aggregations
|
||
6. **AI Features** - Copilot, insights, anomaly detection, query generation
|
||
7. **Self-Service Portal** - Team management, quotas, approvals
|
||
8. **GitOps Integration** - IaC, Terraform provider, drift detection
|
||
9. **Advanced Observability** - Distributed tracing, custom dashboards
|
||
10. **Data Lineage** - Catalog, impact analysis, governance
|
||
11. **Disaster Recovery** - Replication, failover, backups
|
||
12. **Developer Experience** - SDK generation, playground, CLI
|
||
|
||
This design provides a foundation for building an enterprise-grade streaming platform management console with cutting-edge AI capabilities.
|