Mô Hình | Bộ Nhớ Tiêu Thụ Trung Bình | Số Kết Nối Đồng Thời Tối Đa |
---|---|---|
Thread truyền thống | 2-8MB/ thread | ~2,000 |
Goroutine (Go) | ~10KB/ goroutine | ~50,000 |
Hyperlane (Async) | Vài KB/ task | >100,000 |
async fn streaming_concurrent_handler(ctx: Context) { ctx.set_response_status_code(200).await.send().await; for i in 0..10 { let chunk = format!("Chunk {}\n", i); let _ = ctx.set_response_body(chunk).await.send_body().await; tokio::task::yield_now().await; } let _ = ctx.closed().await;}
Số Kết Nối Đồng Thời | Lượt Yêu Cầu/giây | Độ Trễ Trung Bình | Bộ Nhớ Tiêu Thụ |
---|---|---|---|
360 | 324,323.71 | 1.46 ms | 45 MB |
1,000 | 307,568.90 | 3.25 ms | 78 MB |
Mô Hình | Thông Tiết Mô Hình | Điểm Mạnh | Điểm Yếu |
---|---|---|---|
Thread-per-Request | Mỗi request một thread, dùng thread pool trong Java/Tomcat | Dễ triển khai, quen thuộc | Tốn bộ nhớ, hạn chế số kết nối |
Goroutines (Go) | Lightweight threads với runtime quản lý | Tiết kiệm hơn threading | Vẫn tiêu tốn bộ nhớ khá lớn |
Async/Await (Rust) | Tác vụ async nhẹ, ko blocking, cooperative multitasking (Hyperlane) | Cực kỳ tiết kiệm bộ nhớ & CPU | Cần hiểu sâu async và runtime |
async fn parallel_processing_handler(ctx: Context) { let request_body: Vec<u8> = ctx.get_request_body().await; let (result1, result2, result3) = tokio::join!( process_chunk_1(&request_body), process_chunk_2(&request_body), process_chunk_3(&request_body)); let combined_result = format!("{}-{}-{}", result1, result2, result3); ctx.set_response_status_code(200) .await .set_response_body(combined_result) .await;}
async fn resilient_concurrent_handler(ctx: Context) { match process_request_safely(&ctx).await { Ok(response) => { ctx.set_response_status_code(200).await.set_response_body(response).await; } Err(e) => { ctx.set_response_status_code(500).await.set_response_body(format!("Error: {}", e)).await; } }}
async fn load_test_handler(ctx: Context) { let start_time = std::time::Instant::now(); simulate_database_query().await; simulate_api_call().await; simulate_file_operation().await; let total_time = start_time.elapsed(); ctx.set_response_status_code(200) .await .set_response_header("X-Processing-Time", format!("{:.3}ms", total_time.as_secs_f64() * 1000.0)) .await .set_response_body("Load test completed") .await;}
async fn monitored_handler(ctx: Context) { let connection_count = get_active_connections().await; let memory_usage = get_memory_usage().await; ctx.set_response_header("X-Active-Connections", connection_count.to_string()) .await .set_response_header("X-Memory-Usage", format!("{}MB", memory_usage)) .await .set_response_body("Monitoring data included in headers") .await;}