Cách khắc phục nhanh để xử lý tức thì
Không gì làm gián đoạn quá trình tạo nội dung AI dài nhanh hơn lỗi connection reset. Nếu luồng dữ liệu (stream) của bạn bị ngắt giữa chừng, hãy thử các điều chỉnh sau trước tiên:
- Tăng SDK Timeouts: Claude 3.5 Sonnet có thể mất hơn 30 giây để xử lý các câu lệnh (prompt) phức tạp. Thời gian chờ (timeout) mặc định 60 giây là không đủ. Hãy đặt nó ít nhất là 300 giây.
- Tắt Proxy Buffering: Nếu bạn sử dụng Nginx, nó có thể đang cố gắng lưu luồng dữ liệu vào bộ đệm (buffer). Điều này gây ra lỗi timeout khi bộ đệm không được lấp đầy đủ nhanh. Hãy tắt tính năng này.
- Kiểm tra VPN của bạn: Các tường lửa doanh nghiệp như Zscaler hoặc Palo Alto thường ngắt các kết nối TCP "nhàn rỗi" (idle) nếu chúng mở mà không gửi dữ liệu trong hơn 30 giây.
- Cập nhật thư viện: Chạy
pip install -U anthropichoặcnpm install @anthropic-ai/sdk@latestđể đảm bảo bạn có logic xử lý kết nối mới nhất.
Điều gì đang thực sự xảy ra?
Hãy coi "connection reset" (ECONNRESET) giống như một cuộc điện thoại bị dập máy đột ngột. Khác với lỗi timeout tiêu chuẩn khi máy chủ thông báo rằng nó đang bận, lỗi reset có nghĩa là socket đã bị đóng mà không có quy trình bắt tay (handshake) đúng cách.
Lỗi này thường xảy ra trong giai đoạn "suy nghĩ" (Time to First Token). Trong khi Claude xử lý một câu lệnh khổng lồ, kết nối vẫn mở nhưng không có dữ liệu truyền đi. Các thiết bị phần cứng trung gian—như bộ cân bằng tải (load balancer) hoặc tường lửa—thấy sự im lặng này và cho rằng kết nối đã chết, dẫn đến việc ngắt kết nối đột ngột.
Cách khắc phục 1: Điều chỉnh SDK Client Timeouts
Các SDK của Python và Node.js có các thiết lập mặc định khá thận trọng. Khi tạo một báo cáo dài 4.000 token, Claude có thể tạm dừng một chút giữa các phân đoạn, khiến client từ bỏ quá sớm.
Triển khai trên Python SDK
from anthropic import Anthropic
# Chúng tôi khuyến nghị thời gian chờ 10 phút cho các tác vụ viết tài liệu kỹ thuật nặng
client = Anthropic(
api_key="your_api_key",
timeout=600.0,
)
with client.messages.stream(
model="claude-3-5-sonnet-20240620",
max_tokens=4096,
messages=[{"role": "user", "content": "Viết một bản hướng dẫn kỹ thuật dài 20 trang cho một lò phản ứng hạt nhân."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Triển khai trên Node.js SDK
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic({
apiKey: 'my_api_key',
timeout: 600000, // 10 phút tính bằng mili giây
});
const stream = await anthropic.messages.create({
max_tokens: 4096,
messages: [{ role: 'user', content: 'Giải thích lý thuyết trường lượng tử một cách cực kỳ chi tiết' }],
model: 'claude-3-5-sonnet-20240620',
stream: true,
});
for await (const event of stream) {
if (event.type === 'content_block_delta') {
process.stdout.write(event.delta.text);
}
}
Cách khắc phục 2: Tinh chỉnh Nginx và Reverse Proxy
Nếu bạn định tuyến các yêu cầu đến Claude thông qua hạ tầng riêng của mình, Nginx là một điểm nghẽn tiềm tàng. Theo mặc định, Nginx đợi 60 giây (proxy_read_timeout) trước khi đóng kết nối. Nó cũng đệm (buffer) các phản hồi, điều này ngược lại với những gì bạn muốn cho một luồng dữ liệu (stream).
Áp dụng các cài đặt này vào block location trong Nginx của bạn:
location /api/claude/ {
proxy_pass https://api.anthropic.com/;
proxy_http_version 1.1;
proxy_set_header Connection "";
# Quan trọng: streaming sẽ thất bại nếu bật buffering
proxy_buffering off;
proxy_cache off;
# Cho Claude thời gian để suy nghĩ
proxy_read_timeout 600s;
proxy_send_timeout 600s;
# Giữ cho đường truyền luôn mở
keepalive_timeout 600s;
}
Cách khắc phục 3: Vượt qua các thiết bị mạng khắt khe
Trong môi trường văn phòng doanh nghiệp, lỗi connection reset thường đến từ các công cụ Kiểm tra gói tin sâu (Deep Packet Inspection - DPI). Các công cụ này thường ngắt các kết nối HTTPS chạy lâu mà không truyền dữ liệu liên tục.
- Thử nghiệm bên ngoài VPN: Chuyển sang điểm phát sóng di động (hotspot). Nếu lỗi biến mất, mạng doanh nghiệp của bạn đang ngắt luồng dữ liệu.
- Hạ thấp MTU: Trong Docker hoặc một số VPN nhất định, các gói tin lớn hơn 1500 byte sẽ bị phân mảnh. Điều này có thể dẫn đến việc mất kết nối. Hãy thử đặt MTU cho giao diện mạng của bạn thành 1400 bằng lệnh
sudo ifconfig eth0 mtu 1400. - Bắt buộc sử dụng HTTP/1.1: Một số proxy cũ gặp khó khăn với việc đa luồng (multiplexing) của HTTP/2 đối với Server-Sent Events (SSE). Hãy kiểm tra xem môi trường của bạn có cho phép bắt buộc sử dụng giao thức này hay không.
Cách khắc phục 4: Xây dựng vòng lặp thử lại (Retry Loop) bền bỉ
Sự cố mạng là điều không thể tránh khỏi. Thay vì để ứng dụng của bạn bị lỗi, hãy bao bọc luồng dữ liệu trong một cơ chế thử lại với thuật toán exponential backoff (giảm tốc lũy thừa). Cơ chế này sẽ đợi 2 giây, sau đó là 4 giây, rồi 8 giây trước khi từ bỏ.
import time
from anthropic import Anthropic, APIConnectionError
client = Anthropic()
def get_claude_response(prompt, retries=3):
for i in range(retries):
try:
with client.messages.stream(
model="claude-3-5-sonnet-20240620",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}]
) as stream:
for text in stream.text_stream:
yield text
return
except APIConnectionError as e:
if i < retries - 1:
time.sleep(2 ** i)
continue
raise e
Cách kiểm tra kết quả
Đừng chỉ hy vọng nó hoạt động. Hãy kiểm tra bằng ba bước sau:
- Kiểm tra áp lực (Stress Test): Gửi một câu lệnh như "Viết 3000 từ về sự tiến hóa của kiến trúc thế kỷ 18." Nếu nó hoàn thành mà không bị reset, các thiết lập timeout của bạn đã ổn định.
- Kiểm tra đường truyền: Sử dụng
tcpdump -i any port 443để tìm các gói tinRST(Reset). Nếu chúng không còn xuất hiện sau khi bạn thay đổi cấu hình Nginx, bạn đã giải quyết được vấn đề. - Bật nhật ký chi tiết (Verbose Logging): Chạy lệnh
export ANTHROPIC_LOG=debugtrong terminal của bạn. Điều này sẽ tiết lộ chính xác thời điểm kết nối bị ngắt tính theo mili giây, giúp bạn đối chiếu với nhật ký (log) của proxy.

