
Chaos Monkey लेकिन ऑडियो वीडियो परीक्षण के लिए (webRTC और UDP)
वीडियो कॉन्फ्रेंसिंग सिस्टम्स के लोड टेस्टिंग के लिए वितरित कैओस इंजीनियरिंग प्लेटफ़ॉर्म। H.264/Opus स्ट्रीम के साथ 1500+ WebRTC प्रतिभागियों का अनुकरण करता है और गिरावट वाली स्थितियों के तहत सिस्टम की लचीलापन को मान्य करने के लिए नेटवर्क कैओस स्पाइक्स इंजेक्ट करता है।
मीडिया प्रोसेसिंग पाइपलाइन:
कंट्रोल प्लेन:
प्रतिभागी पूल:
participant_id % total_partitions = partition_idKubernetes ऑटो-कॉन्फ़िगरेशन:
orchestrator-3 → PARTITION_ID=3base_port + (partition_id × 10000) + participant_indexUDP रिले चेन (केवल Kubernetes):
ऑर्केस्ट्रेटर पॉड्स (10×) → UDP :5000 → udp-relay पॉड (Python)
→ लेंथ-प्रीफिक्स्ड TCP :5001 → kubectl port-forward 15001:5001
→ tools/udp-relay (Go) → UDP :5002 → आपका रिसीवर
WebRTC इन्फ्रास्ट्रक्चर:
क्लाइंट इंटीग्रेशन:
ऑब्ज़र्वेबिलिटी स्टैक (वैकल्पिक):
/metrics एंडपॉइंट स्क्रैप करता हैprometheus.io/scrape: "true"प्रत्येक आभासी प्रतिभागी वास्तविक मीडिया स्ट्रीम उत्पन्न करता है:
पाँच स्पाइक प्रकार वास्तविक दुनिया की नेटवर्क स्थितियों का अनुकरण करते हैं:
स्पाइक्स परीक्षण अवधि में कॉन्फ़िगरेबल रणनीतियों का उपयोग करके वितरित किए जाते हैं:
Kubernetes डिप्लॉयमेंट क्षैतिज स्केलिंग के लिए प्रतिभागी विभाजन का उपयोग करते हैं:
participant_id % total_partitions == partition_idbase_port + (partition_id * 10000) + participant_indexसर्वोत्तम: विकास, डिबगिंग, छोटे पैमाने के परीक्षण (1-100 प्रतिभागी)
# ऑर्केस्ट्रेटर शुरू करें
go run cmd/main.go
# दूसरे टर्मिनल में: UDP रिसीवर शुरू करें
go run examples/go/udp_receiver.go 5002
# config/config.json संपादित करके num_participants: 10 सेट करें
# कैओस परीक्षण चलाएँ
go run tools/chaos-test/main.go -config config/config.json
क्या होता है:
:8080 पर127.0.0.1:5002 पर भेजते हैंकॉन्फ़िगरेशन (config/config.json):
{
"base_url": "http://localhost:8080",
"media_path": "public/rick-roll.mp4",
"num_participants": 10,
"duration_seconds": 300,
"spikes": {
"count": 20,
"interval_seconds": 5,
"types": { "rtp_packet_loss": {...}, "network_jitter": {...} }
},
"spike_distribution": {
"strategy": "random",
"min_spacing_seconds": 5,
"jitter_percent": 15
}
}
सर्वोत्तम: पृथक परीक्षण, CI/CD, मध्यम पैमाने के परीक्षण (100-500 प्रतिभागी)
पूर्वापेक्षाएँ:
docker-compose स्थापित# ऑर्केस्ट्रेटर कंटेनर बनाएँ और शुरू करें
./scripts/start_everything.sh build
# दूसरे टर्मिनल में: UDP रिसीवर शुरू करें
go run examples/go/udp_receiver.go 5002
# config/config.json संपादित करके num_participants: 100 सेट करें
# कैओस परीक्षण चलाएँ (कंटेनर को लक्ष्य करता है)
go run tools/chaos-test/main.go -config config/config.json
संसाधन सीमाएँ (docker-compose.yaml संपादित करें):
services:
orchestrator:
deploy:
resources:
limits:
cpus: "14.0"
memory: 6G # अधिक प्रतिभागियों के लिए बढ़ाएँ
स्केलिंग गाइड:
| Docker मेमोरी | अधिकतम प्रतिभागी |
|---|
सर्वोत्तम: बड़े पैमाने के परीक्षण (500-1500 प्रतिभागी), क्षैतिज स्केलिंग, उत्पादन सत्यापन
पूर्वापेक्षाएँ:
# Nix प्रदान करता है: Go, Docker, kubectl, kind, ffmpeg
nix develop
# या स्वतः-सक्रियण के लिए direnv का उपयोग करें
echo "use flake" > .envrc
direnv allow
# इष्टतम सेटिंग्स के साथ स्वतः-डिप्लॉय (सिस्टम संसाधनों का पता लगाता है)
./scripts/start_everything.sh run -config config/config.json
# या कस्टम मीडिया फ़ाइलें निर्दिष्ट करें
./scripts/start_everything.sh run --media=path/to/video.mp4 -config config/config.json
क्या होता है:
kubectl port-forward सेट करता हैविकल्प A: UDP रिसीवर (Kubernetes के लिए अनुशंसित)
# सभी 1500 प्रतिभागियों से एकत्रित स्ट्रीम प्राप्त करता है
go run ./examples/go/udp_receiver.go 5002
विकल्प B: WebRTC रिसीवर (एकाधिक प्रतिभागी)
# WebRTC के माध्यम से 150 प्रतिभागियों तक कनेक्ट करें
go run ./examples/go/webrtc_receiver.go http://localhost:8080 <test_id> 150
आर्किटेक्चर प्रवाह:
10 पॉड्स में 1500 प्रतिभागी
→ प्रत्येक पॉड: 150 प्रतिभागी
→ participant_id % 10 द्वारा विभाजन
→ सभी udp-relay:5000 पर UDP भेजते हैं
→ UDP रिले एकत्रित करता है → TCP :5001
→ kubectl port-forward 15001:5001
→ स्थानीय रिले TCP → UDP :5002
→ आपके रिसीवर को सभी 1500 स्ट्रीम मिलती हैं
नोट: start_everything.sh स्क्रिप्ट स्वचालित रूप से सेट करती है:
# इमेज बनाएँ और लोड करें
docker build -t chaos-monkey-orchestrator:latest .
kind load docker-image chaos-monkey-orchestrator:latest
# डिप्लॉय करें
kubectl apply -f k8s/orchestrator/orchestrator.yaml
kubectl apply -f k8s/udp-relay/udp-relay.yaml
# पॉड्स की प्रतीक्षा करें
kubectl wait --for=condition=ready pod -l app=orchestrator --timeout=300s
# UDP रिले पोर्ट-फॉरवर्ड करें
kubectl port-forward udp-relay 15001:5001 &
# स्थानीय TCP→UDP रिले शुरू करें
go run tools/udp-relay/main.go &
# दूसरे टर्मिनल में: रिसीवर शुरू करें
go run ./examples/go/udp_receiver.go 5002
# दूसरे टर्मिनल में: कैओस परीक्षण चलाएँ
go run tools/chaos-test/main.go -config config/config.json
# Kubernetes संसाधन हटाएँ
./scripts/cleanup.sh
# या पूरा क्लस्टर हटाएँ
kind delete cluster --name av-chaos-monkey
# Linux x86_64 के लिए बनाएँ (सबसे सामान्य)
nix build .#packages.x86_64-linux.av-chaos-monkey
# ARM64 के लिए बनाएँ (Raspberry Pi, AWS Graviton)
nix build .#packages.aarch64-linux.av-chaos-monkey
# macOS Intel के लिए बनाएँ
nix build .#packages.x86_64-darwin.av-chaos-monkey
# macOS Apple Silicon के लिए बनाएँ
nix build .#packages.aarch64-darwin.av-chaos-monkey
# बाइनरी स्थान
./result/bin/main
# परीक्षण बनाएँ
POST /api/v1/test/create
{
"test_id": "optional_id",
"num_participants": 100,
"video": {...},
"audio": {...},
"duration_seconds": 600,
"spikes": [...],
"spike_distribution": {
"strategy": "even",
"min_spacing_seconds": 5,
"jitter_percent": 15
}
}
# परीक्षण शुरू करें
POST /api/v1/test/{test_id}/start
# मेट्रिक्स प्राप्त करें
GET /api/v1/test/{test_id}/metrics
# परीक्षण रोकें
POST /api/v1/test/{test_id}/stop
# SDP ऑफ़र प्राप्त करें
GET /api/v1/test/{test_id}/sdp/{participant_id}
# SDP उत्तर सेट करें
POST /api/v1/test/{test_id}/sdp/{participant_id}
{"sdp_answer": "v=0..."}
# स्पाइक इंजेक्ट करें
POST /api/v1/test/{test_id}/spike
{
"spike_id": "unique_id",
"type": "rtp_packet_loss",
"duration_seconds": 30,
"participant_ids": [1001, 1002],
"params": {"loss_percentage": "15"}
}
{
"spike_distribution": {
"strategy": "even",
"min_spacing_seconds": 5,
"jitter_percent": 15,
"respect_min_offset": true
}
}
# RTP पार्सिंग के साथ प्रदान किया गया रिसीवर
go run examples/go/udp_receiver.go 5002
आउटपुट:
Listening for RTP packets on UDP port 0.0.0.0:5002
Packet #100 from 127.0.0.1:xxxxx:
Participant ID: 1001
Payload Type: 96 (H.264 video)
Sequence: 1234
Timestamp: 90000
SSRC: 1001000
Payload Size: 1200 bytes
═══════════════════════════════════════════════════════════
पैकेट सांख्यिकी
═══════════════════════════════════════════════════════════
Duration: 60s
Total Packets: 180000 (3000 pkt/s)
Total Bytes: 450 MB (60 Mbps)
मीडिया प्रकार विवरण:
Video (H.264): 120000 packets (66.7%)
Audio (Opus): 60000 packets (33.3%)
अद्वितीय स्ट्रीम (SSRCs): 1500
अद्वितीय प्रतिभागी: 1500
# एकल प्रतिभागी
go run ./examples/go/webrtc_receiver.go http://localhost:8080 <test_id>
# एकाधिक प्रतिभागी (150 तक)
go run ./examples/go/webrtc_receiver.go http://localhost:8080 <test_id> 150
# वास्तविक परीक्षण ID के साथ उदाहरण
go run ./examples/go/webrtc_receiver.go http://localhost:8080 chaos_test_1770831684 150
नोट: WebRTC को 1:1 कनेक्शन की आवश्यकता है। Kubernetes के लिए, UDP रिसीवर का उपयोग करें जो सभी प्रतिभागियों को स्वचालित रूप से एकत्रित करता है।
RTP पैकेट प्रारूप:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extension ID=1 | Length=4 | Participant ID (uint32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| H.264/Opus Payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
पेलोड प्रकार:
96: H.264 वीडियो (RFC 6184)111: Opus ऑडियो (RFC 7587)प्रतिभागी ID निष्कर्षण:
// एक्सटेंशन बिट सेट है?
if (packet[0] & 0x10) != 0 {
offset := 12 + int(packet[0]&0x0F)*4 // CSRC छोड़ें
extID := binary.BigEndian.Uint16(packet[offset:])
if extID == 1 {
participantID := binary.LittleEndian.Uint32(packet[offset+4:])
}
}
प्रति प्रतिभागी (1280x720@30fps + Opus):
# /metrics एंडपॉइंट पर एक्सपोज़्ड
av_chaos_monkey_participants_total
av_chaos_monkey_packets_sent_total
av_chaos_monkey_bytes_sent_total
av_chaos_monkey_spikes_active
av_chaos_monkey_packet_loss_percent
av_chaos_monkey_jitter_ms
# Docker Mode: मॉनिटरिंग स्टैक शुरू करें
docker-compose --profile monitoring up
# Kubernetes Mode: मॉनिटरिंग डिप्लॉय करें
kubectl apply -f k8s/monitoring/prometheus-rbac.yaml
kubectl apply -f k8s/monitoring/prometheus.yaml
kubectl apply -f k8s/monitoring/grafana.yaml
# Grafana एक्सेस करें
# Docker: http://localhost:3000
# Kubernetes: http://localhost:30030 (NodePort)
# डिफ़ॉल्ट क्रेडेंशियल्स: admin/admin
# Prometheus एक्सेस करें
# Docker: http://localhost:9091
# Kubernetes: http://localhost:30090 (NodePort)
Kubernetes स्वतः-खोज:
prometheus.io/scrape: "true" के साथ एनोटेट/metrics स्क्रैप करता है# परीक्षण मेट्रिक्स प्राप्त करें
curl http://localhost:8080/api/v1/test/{test_id}/metrics | jq
# आउटपुट
{
"aggregate": {
"total_frames_sent": 45000,
"total_packets_sent": 180000,
"total_bitrate_kbps": 250000,
"avg_jitter_ms": 12.5,
"avg_packet_loss": 2.3,
"avg_mos_score": 4.1
}
}
# UDP लक्ष्य कॉन्फ़िगरेशन जाँचें
kubectl logs orchestrator-0 | grep "UDP transmission enabled"
# सत्यापित करें कि UDP रिले चल रहा है
kubectl get pod udp-relay
# पोर्ट-फॉरवर्ड जाँचें
ps aux | grep "kubectl port-forward"
# UDP कनेक्टिविटी का परीक्षण करें
nc -u -z localhost 5002
# TURN सर्वर जाँचें
kubectl get svc coturn-lb
# ICE उम्मीदवार सत्यापित करें
kubectl logs orchestrator-0 | grep "ICE"
# TURN कनेक्टिविटी का परीक्षण करें
turnutils_uclient -v -u webrtc -w webrtc123 <turn-server>:3478
# प्रति पॉड प्रतिभागी संख्या जाँचें
kubectl exec orchestrator-0 -- curl -s http://localhost:8080/api/v1/test/{test_id}/metrics | jq '.participants | length'
# प्रतिभागियों को कम करें या पॉड संख्या बढ़ाएँ
go run tools/k8s-start/main.go -replicas 10 -participants 1000
# Docker मेमोरी बढ़ाएँ (Docker Desktop)
# Settings → Resources → Memory → 16GB
एकल UDP सॉकेट कर्नेल बफ़र ओवरफ़्लो के बिना 3000+ समवर्ती स्ट्रीम नहीं संभाल सकता। समाधान:
setsockopt(SO_RCVBUF, 8MB)BSD 3-Clause License
योगदान का स्वागत है! मुख्य क्षेत्र:
| CPU कोर |
|---|
| 8 GB | ~100 | 4 |
| 16 GB | ~250 | 8 |
| 24 GB | ~400 | 12 |
| 32 GB | ~500 | 14 |
| प्रकार | पैरामीटर | प्रभाव |
|---|
rtp_packet_loss | loss_percentage (0-100) | RTP लेयर पर पैकेट छोड़ता है |
network_jitter | base_latency_ms, jitter_std_dev_ms | विलंबता भिन्नता जोड़ता है |
bitrate_reduce | new_bitrate_kbps | वीडियो एन्कोडिंग को थ्रॉटल करता है |
frame_drop | drop_percentage (0-100) | वीडियो फ्रेम्स छोड़ता है |
bandwidth_limit | bandwidth_kbps | कुल थ्रूपुट को सीमित करता है |
| प्रतिभागी | मेमोरी | CPU | बैंडविड्थ |
|---|
| 100 | 2GB | 2 कोर | 250 Mbps |
| 500 | 6GB | 8 कोर | 1.2 Gbps |
| 1000 | 12GB | 16 कोर | 2.5 Gbps |
| 1500 | 18GB | 24 कोर | 3.7 Gbps |