Chào các bạn, tôi là Minh Đức, Senior DevOps Engineer với 8 năm kinh nghiệm triển khai hệ thống AI production. Trong bài viết này, tôi sẽ chia sẻ kinh nghiệm thực chiến về việc thiết kế quy trình rollback cho AI service, từ những bài học đắt giá khi hệ thống của chúng tôi từng chịu 3 lần downtime nghiêm trọng trong một tháng.

Vì sao cần chiến lược Rollback cho AI Service?

Khác với web service truyền thống, AI service có những đặc thù riêng khiến việc rollback trở nên phức tạp hơn nhiều:

Kiến trúc Rollback 3 Lớp

Lớp 1: API Gateway với Feature Flag

Tôi đã xây dựng một hệ thống feature flag tại tầng gateway để điều khiển traffic giữa các phiên bản model:

# rollback_manager.py - Hệ thống Rollback cho AI Service

Đặt tại API Gateway hoặc Load Balancer layer

import asyncio import hashlib from datetime import datetime, timedelta from typing import Dict, List, Optional from dataclasses import dataclass from enum import Enum class RollbackStatus(Enum): STABLE = "stable" DEGRADED = "degraded" ROLLBACK_IN_PROGRESS = "rollback_in_progress" FAILED = "failed" @dataclass class ModelVersion: version_id: str provider: str # "openai", "anthropic", "holysheep" endpoint: str weight: float # Traffic weight (0.0 - 1.0) status: RollbackStatus deployed_at: datetime error_rate: float = 0.0 avg_latency_ms: float = 0.0 p99_latency_ms: float = 0.0 class AIRollbackManager: """ Quản lý rollback cho AI service với multi-provider support """ def __init__(self): self.versions: Dict[str, ModelVersion] = {} self.current_active: Optional[str] = None self.rollback_history: List[Dict] = [] self.alert_threshold_error_rate = 5.0 # 5% self.alert_threshold_latency_p99 = 3000 # 3 giây self.auto_rollback_enabled = True def register_version(self, version_id: str, provider: str, api_key: str, weight: float = 1.0) -> bool: """Đăng ký một phiên bản model mới""" # Map provider sang endpoint endpoints = { "holysheep": "https://api.holysheep.ai/v1/chat/completions", "openai": "https://api.openai.com/v1/chat/completions", # fallback only "anthropic": "https://api.anthropic.com/v1/messages" } if provider not in endpoints: raise ValueError(f"Provider {provider} không được hỗ trợ") version = ModelVersion( version_id=version_id, provider=provider, endpoint=endpoints[provider], weight=weight, status=RollbackStatus.STABLE, deployed_at=datetime.now() ) self.versions[version_id] = version print(f"✅ Đã đăng ký version: {version_id} -> {provider}") return True async def health_check(self, version_id: str, test_requests: int = 10) -> Dict: """Kiểm tra health của một phiên bản""" if version_id not in self.versions: return {"status": "not_found", "version_id": version_id} version = self.versions[version_id] errors = 0 latencies = [] for _ in range(test_requests): start = asyncio.get_event_loop().time() try: # Test request đơn giản response = await self._test_request(version) latency = (asyncio.get_event_loop().time() - start) * 1000 latencies.append(latency) except Exception as e: errors += 1 print(f"❌ Health check failed: {e}") error_rate = (errors / test_requests) * 100 avg_latency = sum(latencies) / len(latencies) if latencies else 0 p99_latency = sorted(latencies)[int(len(latencies) * 0.99)] if latencies else 0 version.error_rate = error_rate version.avg_latency_ms = avg_latency version.p99_latency_ms = p99_latency health_score = self._calculate_health_score(version) return { "version_id": version_id, "error_rate": f"{error_rate:.2f}%", "avg_latency_ms": f"{avg_latency:.2f}", "p99_latency_ms": f"{p99_latency:.2f}", "health_score": health_score, "status": "healthy" if health_score > 80 else "degraded" } def _calculate_health_score(self, version: ModelVersion) -> float: """Tính health score dựa trên error rate và latency""" # Error rate scoring (0-50 điểm) error_score = max(0, 50 - (version.error_rate * 10)) # Latency scoring (0-50 điểm) - baseline 500ms if version.p99_latency_ms < 500: latency_score = 50 elif version.p99_latency_ms < 2000: latency_score = 50 - ((version.p99_latency_ms - 500) / 30) else: latency_score = max(0, 25 - ((version.p99_latency_ms - 2000) / 100)) return error_score + latency_score async def initiate_rollback(self, from_version: str, to_version: str, gradual: bool = True, steps: int = 5) -> Dict: """Khởi tạo quy trình rollback""" if from_version not in self.versions or to_version not in self.versions: raise ValueError("Version không tồn tại") print(f"🔄 Bắt đầu rollback: {from_version} -> {to_version}") rollback_record = { "id": hashlib.md5(f"{datetime.now().isoformat()}".encode()).hexdigest()[:8], "from_version": from_version, "to_version": to_version, "started_at": datetime.now().isoformat(), "steps": steps, "current_step": 0, "status": "in_progress" } self.rollback_history.append(rollback_record) if gradual: await self._gradual_rollback(rollback_record) else: await self._immediate_rollback(rollback_record) return rollback_record async def _gradual_rollback(self, record: Dict, interval_seconds: int = 30): """Rollback từ từ theo từng bước""" to_version = self.versions[record["to_version"]] steps = record["steps"] for step in range(steps, 0, -1): new_weight = (steps - step + 1) / steps to_version.weight = new_weight # Cập nhật weight trong nginx/k8s config await self._update_routing_config(to_version.version_id, new_weight) record["current_step"] = steps - step + 1 print(f"📊 Step {record['current_step']}/{steps}: Weight = {new_weight:.2f}") # Monitor trong 30 giây await asyncio.sleep(interval_seconds) health = await self.health_check(to_version.version_id) if health["health_score"] < 50: print(f"⚠️ Health score thấp: {health['health_score']}, dừng rollback") record["status"] = "paused" return # Hoàn tất rollback to_version.weight = 1.0 await self._update_routing_config(to_version.version_id, 1.0) record["status"] = "completed" record["completed_at"] = datetime.now().isoformat() print("✅ Rollback hoàn tất!") async def _immediate_rollback(self, record: Dict): """Rollback ngay lập tức""" to_version = self.versions[record["to_version"]] to_version.weight = 1.0 await self._update_routing_config(to_version.version_id, 1.0) record["status"] = "completed" record["completed_at"] = datetime.now().isoformat() print("✅ Immediate rollback hoàn tất!")

============== Khởi tạo với HolySheep AI ==============

rollback_manager = AIRollbackManager()

Đăng ký phiên bản production sử dụng HolySheep

rollback_manager.register_version( version_id="holysheep-gpt4-prod", provider="holysheep", api_key="YOUR_HOLYSHEEP_API_KEY", weight=0.9 )

Phiên bản backup

rollback_manager.register_version( version_id="holysheep-claude-backup", provider="holysheep", api_key="YOUR_HOLYSHEEP_API_KEY", weight=0.1 ) print("🚀 Hệ thống rollback sẵn sàng với HolySheep AI") print(f"💰 Chi phí: GPT-4.1 $8/MTok, Claude Sonnet 4.5 $15/MTok, DeepSeek V3.2 $0.42/MTok")

Lớp 2: Circuit Breaker Pattern

Đây là thành phần quan trọng giúp tự động phát hiện và cô lập khi API provider gặp sự cố:

# circuit_breaker.py - Circuit Breaker cho AI API Calls

Ngăn chặn cascade failure khi provider gặp vấn đề

import time import asyncio from enum import Enum from typing import Callable, Any, Optional from dataclasses import dataclass, field from collections import deque class CircuitState(Enum): CLOSED = "closed" # Bình thường, request đi qua OPEN = "open" # Đang block, không cho request đi HALF_OPEN = "half_open" # Thử nghiệm, cho một số request đi @dataclass class CircuitBreakerConfig: failure_threshold: int = 5 # Số lần fail để open circuit success_threshold: int = 3 # Số lần success để close circuit timeout_seconds: float = 30.0 # Thời gian chuyển từ OPEN sang HALF_OPEN half_open_max_calls: int = 3 # Số call trong trạng thái half_open @dataclass class CircuitMetrics: total_calls: int = 0 successful_calls: int = 0 failed_calls: int = 0 consecutive_failures: int = 0 consecutive_successes: int = 0 last_failure_time: Optional[float] = None last_success_time: Optional[float] = None recent_errors: deque = field(default_factory=lambda: deque(maxlen=20)) latency_p50_ms: float = 0.0 latency_p99_ms: float = 0.0 class CircuitBreaker: """ Circuit Breaker Pattern cho AI API Calls Trạng thái: - CLOSED: Request bình thường, errors được track - OPEN: Tất cả request bị reject ngay lập tức - HALF_OPEN: Cho một số request đi thử nghiệm """ def __init__(self, name: str, config: Optional[CircuitBreakerConfig] = None): self.name = name self.config = config or CircuitBreakerConfig() self.state = CircuitState.CLOSED self.metrics = CircuitMetrics() self._half_open_calls = 0 self._lock = asyncio.Lock() # Monitoring callback self.on_state_change: Optional[Callable] = None self.on_circuit_open: Optional[Callable] = None async def call(self, func: Callable, *args, **kwargs) -> Any: """Thực hiện call với circuit breaker protection""" async with self._lock: # Kiểm tra state trước khi call if not await self._can_execute(): raise CircuitBreakerOpenError( f"Circuit '{self.name}' is OPEN. " f"Last failure: {self.metrics.last_failure_time}" ) # Trong HALF_OPEN chỉ cho max calls if self.state == CircuitState.HALF_OPEN: if self._half_open_calls >= self.config.half_open_max_calls: raise CircuitBreakerOpenError( f"Circuit '{self.name}' đang trong HALF_OPEN, " f"đã đạt max calls" ) self._half_open_calls += 1 # Thực hiện request với timing start_time = time.perf_counter() try: if asyncio.iscoroutinefunction(func): result = await func(*args, **kwargs) else: result = func(*args, **kwargs) latency_ms = (time.perf_counter() - start_time) * 1000 await self._record_success(latency_ms) return result except Exception as e: latency_ms = (time.perf_counter() - start_time) * 1000 await self._record_failure(str(e), latency_ms) raise async def _can_execute(self) -> bool: """Kiểm tra xem có thể thực hiện request không""" if self.state == CircuitState.CLOSED: return True if self.state == CircuitState.OPEN: # Kiểm tra timeout để chuyển sang HALF_OPEN if self.metrics.last_failure_time: time_since_failure = time.time() - self.metrics.last_failure_time if time_since_failure >= self.config.timeout_seconds: await self._transition_to_half_open() return True return False # HALF_OPEN: cho phép một số request đi return True async def _record_success(self, latency_ms: float): """Ghi nhận thành công""" async with self._lock: self.metrics.total_calls += 1 self.metrics.successful_calls += 1 self.metrics.consecutive_successes += 1 self.metrics.consecutive_failures = 0 self.metrics.last_success_time = time.time() # Update latency metrics self._update_latency_metrics(latency_ms) if self.state == CircuitState.HALF_OPEN: if self.metrics.consecutive_successes >= self.config.success_threshold: await self._transition_to_closed() async def _record_failure(self, error: str, latency_ms: float): """Ghi nhận thất bại""" async with self._lock: self.metrics.total_calls += 1 self.metrics.failed_calls += 1 self.metrics.consecutive_failures += 1 self.metrics.consecutive_successes = 0 self.metrics.last_failure_time = time.time() self.metrics.recent_errors.append({ "error": error, "timestamp": time.time(), "latency_ms": latency_ms }) self._update_latency_metrics(latency_ms) # Kiểm tra threshold để open circuit if (self.state == CircuitState.CLOSED and self.metrics.consecutive_failures >= self.config.failure_threshold): await self._transition_to_open() elif self.state == CircuitState.HALF_OPEN: # Bất kỳ fail nào trong HALF_OPEN đều chuyển về OPEN await self._transition_to_open() def _update_latency_metrics(self, latency_ms: float): """Cập nhật latency metrics đơn giản""" # Sử dụng moving average đơn giản alpha = 0.1 self.metrics.latency_p50_ms = ( (1 - alpha) * self.metrics.latency_p50_ms + alpha * latency_ms ) self.metrics.latency_p99_ms = ( (1 - alpha * 0.5) * self.metrics.latency_p99_ms + alpha * 0.5 * latency_ms * 1.5 ) async def _transition_to_open(self): """Chuyển sang trạng thái OPEN""" if self.state != CircuitState.OPEN: old_state = self.state self.state = CircuitState.OPEN self._half_open_calls = 0 print(f"🔴 Circuit '{self.name}': {old_state.value} -> OPEN") if self.on_circuit_open: await self.on_circuit_open(self) async def _transition_to_half_open(self): """Chuyển sang trạng thái HALF_OPEN""" old_state = self.state self.state = CircuitState.HALF_OPEN self._half_open_calls = 0 print(f"🟡 Circuit '{self.name}': {old_state.value} -> HALF_OPEN") async def _transition_to_closed(self): """Chuyển sang trạng thái CLOSED""" old_state = self.state self.state = CircuitState.CLOSED self.metrics.consecutive_failures = 0 self._half_open_calls = 0 print(f"🟢 Circuit '{self.name}': {old_state.value} -> CLOSED") def get_status(self) -> dict: """Lấy trạng thái circuit breaker""" return { "name": self.name, "state": self.state.value, "metrics": { "total_calls": self.metrics.total_calls, "success_rate": ( self.metrics.successful_calls / self.metrics.total_calls * 100 if self.metrics.total_calls > 0 else 0 ), "consecutive_failures": self.metrics.consecutive_failures, "latency_p50_ms": round(self.metrics.latency_p50_ms, 2), "latency_p99_ms": round(self.metrics.latency_p99_ms, 2), "last_failure": self.metrics.last_failure_time } } async def reset(self): """Reset circuit breaker về trạng thái ban đầu""" async with self._lock: self.state = CircuitState.CLOSED self.metrics = CircuitMetrics() self._half_open_calls = 0 print(f"🔄 Circuit '{self.name}' đã được reset") class CircuitBreakerOpenError(Exception): """Exception khi circuit breaker đang OPEN""" pass

============== Triển khai với HolySheep AI ==============

Tạo circuit breaker cho từng provider

circuit_holysheep = CircuitBreaker( name="holysheep-primary", config=CircuitBreakerConfig( failure_threshold=3, success_threshold=2, timeout_seconds=15.0 ) )

Callback khi circuit open - trigger rollback

async def on_circuit_open(circuit: CircuitBreaker): print(f"🚨 CIRCUIT OPEN: {circuit.name}") print(f" Triggering automatic rollback...") # Gọi rollback manager ở đây # await rollback_manager.initiate_rollback(...) circuit_holysheep.on_circuit_open = on_circuit_open

Ví dụ sử dụng trong AI request

async def call_ai_with_protection(prompt: str): async def make_request(): # Sử dụng HolySheep API import aiohttp url = "https://api.holysheep.ai/v1/chat/completions" headers = { "Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY", "Content-Type": "application/json" } data = { "model": "gpt-4.1", "messages": [{"role": "user", "content": prompt}] } async with aiohttp.ClientSession() as session: async with session.post(url, json=data, headers=headers) as resp: return await resp.json() try: result = await circuit_holysheep.call(make_request) return result except CircuitBreakerOpenError as e: print(f"⚠️ {e}") # Fallback sang provider khác hoặc trả cache return await fallback_to_backup(prompt) async def fallback_to_backup(prompt: str): """Fallback sử dụng DeepSeek qua HolySheep - chi phí thấp hơn""" print("🔀 Sử dụng fallback DeepSeek V3.2 ($0.42/MTok)") # Implement fallback logic pass

Check status

print("📊 Circuit Breaker Status:", circuit_holysheep.get_status())

Lớp 3: Automated Monitoring và Alerting

Hệ thống monitoring giúp phát hiện sớm các vấn đề trước khi cần rollback:

# monitoring.py - Real-time Monitoring cho AI Service

Tự động phát hiện anomaly và trigger rollback

import asyncio import json from datetime import datetime, timedelta from typing import Dict, List, Optional from dataclasses import dataclass import aiohttp @dataclass class AlertRule: name: str metric: str threshold: float operator: str # "gt", "lt", "eq" duration_seconds: int severity: str # "warning", "critical" action: str # "alert", "auto_rollback" @dataclass class Alert: rule_name: str severity: str message: str timestamp: datetime current_value: float threshold: float class AIMonitoringSystem: """ Hệ thống monitoring real-time cho AI service Tích hợp với HolySheep AI metrics """ def __init__(self, webhook_url: Optional[str] = None): self.metrics_history: Dict[str, List[Dict]] = {} self.alerts: List[Alert] = [] self.alert_rules: List[AlertRule] = [] self.webhook_url = webhook_url self.dashboard_data = { "requests_total": 0, "requests_success": 0, "requests_failed": 0, "total_tokens": 0, "total_cost_usd": 0.0, "avg_latency_ms": 0, "p99_latency_ms": 0 } # Định nghĩa các alert rules self._setup_default_rules() def _setup_default_rules(self): """Cài đặt các alert rules mặc định""" self.alert_rules = [ AlertRule( name="high_error_rate", metric="error_rate", threshold=5.0, operator="gt", duration_seconds=60, severity="critical", action="auto_rollback" ), AlertRule( name="high_latency", metric="p99_latency_ms", threshold=3000, operator="gt", duration_seconds=120, severity="warning", action="alert" ), AlertRule( name="cost_anomaly", metric="cost_per_minute", threshold=100.0, # $100/phút operator="gt", duration_seconds=300, severity="critical", action="alert" ), AlertRule( name="low_success_rate", metric="success_rate", threshold=95.0, operator="lt", duration_seconds=300, severity="critical", action="auto_rollback" ) ] async def record_request(self, provider: str, success: bool, latency_ms: float, tokens_used: int, cost_usd: float): """Ghi nhận một request""" now = datetime.now() bucket = now.strftime("%Y-%m-%d %H:%M") if bucket not in self.metrics_history: self.metrics_history[bucket] = [] self.metrics_history[bucket].append({ "timestamp": now, "provider": provider, "success": success, "latency_ms": latency_ms, "tokens": tokens_used, "cost_usd": cost_usd }) # Cập nhật dashboard self.dashboard_data["requests_total"] += 1 if success: self.dashboard_data["requests_success"] += 1 else: self.dashboard_data["requests_failed"] += 1 self.dashboard_data["total_tokens"] += tokens_used self.dashboard_data["total_cost_usd"] += cost_usd def get_current_metrics(self) -> Dict: """Tính toán metrics hiện tại""" now = datetime.now() last_5_minutes = now - timedelta(minutes=5) recent_requests = [] for bucket_data in self.metrics_history.values(): for req in bucket_data: if req["timestamp"] >= last_5_minutes: recent_requests.append(req) if not recent_requests: return { "error_rate": 0, "success_rate": 100, "avg_latency_ms": 0, "p99_latency_ms": 0, "cost_per_minute": 0, "rpm": 0 } total = len(recent_requests) successful = sum(1 for r in recent_requests if r["success"]) total_latency = sum(r["latency_ms"] for r in recent_requests) total_cost = sum(r["cost_usd"] for r in recent_requests) # Tính P99 latency sorted_latencies = sorted(r["latency_ms"] for r in recent_requests) p99_index = int(len(sorted_latencies) * 0.99) p99_latency = sorted_latencies[p99_index] if sorted_latencies else 0 # Tính cost per minute (trong 5 phút) cost_per_minute = (total_cost / 5) if total_cost > 0 else 0 return { "error_rate": round((total - successful) / total * 100, 2), "success_rate": round(successful / total * 100, 2), "avg_latency_ms": round(total_latency / total, 2), "p99_latency_ms": round(p99_latency, 2), "cost_per_minute": round(cost_per_minute, 2), "rpm": round(total / 5, 2), # requests per minute "total_requests_5min": total } async def evaluate_alert_rules(self) -> List[Alert]: """Đánh giá tất cả alert rules""" current_metrics = self.get_current_metrics() triggered_alerts = [] for rule in self.alert_rules: value = current_metrics.get(rule.metric, 0) breached = self._check_threshold(value, rule.threshold, rule.operator) if breached: alert = Alert( rule_name=rule.name, severity=rule.severity, message=self._format_alert_message(rule, value), timestamp=datetime.now(), current_value=value, threshold=rule.threshold ) triggered_alerts.append(alert) self.alerts.append(alert) # Thực hiện action if rule.action == "auto_rollback" and rule.severity == "critical": await self._trigger_auto_rollback(alert) # Gửi webhook notification if self.webhook_url: await self._send_webhook(alert) return triggered_alerts def _check_threshold(self, value: float, threshold: float, operator: str) -> bool: """Kiểm tra ngưỡng""" if operator == "gt": return value > threshold elif operator == "lt": return value < threshold elif operator == "eq": return value == threshold return False def _format_alert_message(self, rule: AlertRule, value: float) -> str: """Format message cho alert""" operator_symbol = { "gt": ">", "lt": "<", "eq": "=" }.get(rule.operator, rule.operator) return ( f"🔔 Alert: {rule.name}\n" f" Severity: {rule.severity.upper()}\n" f" Current: {value:.2f} {operator_symbol} {rule.threshold}\n" f" Metric: {rule.metric}\n" f" Action: {rule.action}" ) async def _trigger_auto_rollback(self, alert: Alert): """Trigger automatic rollback khi alert critical""" print(f"🚨🚨🚨 AUTO ROLLBACK TRIGGERED 🚨🚨🚨") print(f" Alert: {alert.rule_name}") print(f" Value: {alert.current_value} (threshold: {alert.threshold})") # Gọi rollback manager # await rollback_manager.initiate_rollback(...) # Log event rollback_event = { "type": "auto_rollback", "triggered_by": alert.rule_name, "timestamp": datetime.now().isoformat(), "alert_details": { "severity": alert.severity, "current_value": alert.current_value } } print(f"📝 Rollback event logged: {json.dumps(rollback_event, indent=2)}") async def _send_webhook(self, alert: Alert): """Gửi notification qua webhook""" try: payload = { "alert": { "name": alert.rule_name, "severity": alert.severity, "message": alert.message, "timestamp": alert.timestamp.isoformat(), "current_value": alert.current_value, "threshold": alert.threshold }, "current_metrics": self.get_current_metrics() } async with aiohttp.ClientSession() as session: await session.post( self.webhook_url, json=payload, headers={"Content-Type": "application/json"} ) print(f"✅ Webhook sent for alert: {alert.rule_name}") except Exception as e: print(f"❌ Failed to send webhook: {e}") def get_dashboard(self) -> Dict: """Lấy dữ liệu dashboard""" metrics = self.get_current_metrics() return { "timestamp": datetime.now().isoformat(), "service_status": self._calculate_service_status(metrics), "metrics": metrics, "cumulated": self.dashboard_data, "recent_alerts": [ { "rule": a.rule_name, "severity": a.severity, "timestamp": a.timestamp.isoformat() } for a in self.alerts[-10:] ] } def _calculate_service_status(self, metrics: Dict) -> str: """Tính toán trạng thái service tổng thể""" if metrics["success_rate"] >= 99 and metrics["p99_latency_ms"] < 2000: return "🟢 HEALTHY" elif metrics["success_rate"] >= 95 and metrics["p99_latency_ms"] < 3000: return "🟡 DEGRADED" else: return "🔴 CRITICAL" async def start_monitoring_loop(self, interval_seconds: int = 10): """Bắt đầu vòng lặp monitoring""" print(f"📊 Bắt đầu monitoring loop (interval: {interval_seconds}s)") while True: try: # Evaluate alerts triggered = await self.evaluate_alert_rules() if triggered: for alert in triggered: print(alert.message) # Dashboard update dashboard = self.get_dashboard() print(f"\n{'='*60}") print(f"📈 AI Service Dashboard - {dashboard['timestamp']}") print(f"{'='*60}") print(f"Status: {dashboard['service_status']}") print(f"Error Rate: {dashboard['metrics']['error_rate']}%") print(f"Success Rate: {dashboard['metrics']['success_rate']}%") print(f"P99 Latency: {dashboard['metrics']['p99_latency_ms']}ms") print(f"Cost/Min: ${dashboard['metrics']['cost_per_minute']:.2f}") print(f"{'='*60}\n") except Exception as e: print(f"❌ Monitoring error: {e}") await asyncio.sleep(interval_seconds)

============== Triển khai với HolySheep AI ==============

monitoring = AIMonitoringSystem( webhook_url="https://your-webhook-endpoint.com/alerts" )

Thêm custom rule cho HolySheep specific metrics

monitoring.alert_rules.append( AlertRule( name="holysheep_quota_warning", metric="quota_usage_percent", threshold=80.0, operator="gt", duration_seconds=60, severity="warning", action="alert" ) )

Simulate monitoring loop

async def simulate_requests