# Code Snippet Thực Tế (Parallel Fetching)

Dưới đây là kỹ thuật được dùng trong `backend/api/product/stock_route.py` để lấy tồn kho từ Canifa ERP mà không làm nghẽn mạng hay bị treo khi lượng SKU lớn.

Hệ thống chặt (chunk) các SKUs ra thành các mảng nhỏ (mặc định 50 SKUs/mảng), rồi dùng `asyncio.gather` gọi API đồng thời, tiết kiệm tối đa thời gian.

```python
# Trích xuất từ backend/api/product/stock_route.py
import asyncio
import httpx

STOCK_API_URL = "https://canifa.com/v1/middleware/stock_get_stock_list"

async def fetch_stock_parallel(ordered_skus: list[str], chunk_size: int, timeout_sec: float):
    stock_responses = []
    
    async with httpx.AsyncClient(timeout=timeout_sec) as client:
        tasks = []
        # Hàm _chunked chia list thành các mảng con có kích thước chunk_size
        for chunk in _chunked(ordered_skus, chunk_size):
            tasks.append(client.get(STOCK_API_URL, params={"skus": ",".join(chunk)}))
        
        # Chạy TẤT CẢ request cùng lúc, không ném văng Exception toàn cục nếu 1 cái fail
        responses = await asyncio.gather(*tasks, return_exceptions=True)
        
        for i, resp in enumerate(responses):
            if isinstance(resp, Exception):
                logger.error(f"❌ Error fetching chunk {i}: {resp}")
                continue
            
            try:
                resp.raise_for_status()
                stock_responses.append(resp.json())
            except Exception as e:
                logger.error(f"❌ Error processing chunk {i}: {e}")
                
    return stock_responses
```

Kỹ thuật `return_exceptions=True` đặc biệt quan trọng: nếu 1 request bị timeout, các request chunk khác vẫn được trả về bình thường, đảm bảo user luôn nhận được dữ liệu tốt nhất có thể.
