Một hình ảnh hoạt động trên kết nối trực tiếp nhanh nhưng không đầy đủ qua một proxy chuyển tiếp chậm hơn. Một nguyên nhân khả dĩ là nguồn gốc đóng kết nối trong khi phản hồi vẫn đang được ghi.

I/O của Netty là bất đồng bộ. Việc trở về từ writeAndFlush không có nghĩa là thao tác đó đã hoàn tất. Vì vậy thứ tự này không an toàn cho một phản hồi vẫn còn byte trong hàng đợi:

ctx.writeAndFlush(response);
ctx.close();

Khi trao đổi HTTP được đóng một cách có chủ đích sau thông điệp phản hồi cuối cùng, hãy gắn việc đóng vào future của lần ghi đó:

ctx.writeAndFlush(finalResponseMessage)
    .addListener(ChannelFutureListener.CLOSE);

Đoạn này giả định phản hồi đã được xây dựng và đóng khung đúng cách. Với phần thân được truyền theo luồng, hãy dùng việc hoàn tất thông điệp cuối cùng chứ không phải việc ghi tiêu đề. Với kết nối HTTP liên tục, đừng thêm việc đóng chỉ vì một phản hồi đã kết thúc.

Hãy xem xét lỗi của future như một phần trong việc xử lý lỗi thông thường của ứng dụng. Việc hoàn tất bao gồm lỗi và hủy bỏ, nên chỉ hoàn tất không phải là biên nhận giao hàng từ trình duyệt.

So sánh hữu ích là độ dài đầy đủ của phản hồi và kết quả ghi trên từng đường. Proxy có thể thay đổi thời gian đủ để phơi ra một lỗi vòng đời sẵn có; sự hiện diện của nó không chứng minh rằng bộ nén hoặc bộ nhớ đệm của nó đã bỏ các byte.

Bài viết liên quan