ภาพที่ไม่สมบูรณ์ผ่านพร็อกซี: ตรวจสอบการเขียนเสร็จสิ้นของ Netty
เมื่อภาพมาถึงไม่สมบูรณ์ผ่านพร็อกซี ให้ตรวจสอบว่าแหล่งต้นทางปิดแชนเนล Netty ก่อนที่การเขียนการตอบกลับแบบอะซิงโครนัสจะเสร็จสิ้นหรือไม่
ภาพหนึ่งทำงานบนการเชื่อมต่อโดยตรงที่รวดเร็ว แต่ไม่สมบูรณ์เมื่อผ่านพร็อกซีส่งต่อที่ช้ากว่า สาเหตุที่เป็นไปได้อย่างหนึ่งคือแหล่งต้นทางปิดการเชื่อมต่อขณะที่การตอบกลับยังถูกเขียนอยู่
Netty I/O เป็นแบบอะซิงโครนัส การกลับมาจาก writeAndFlush ไม่ได้หมายความว่าการดำเนินการนั้นเสร็จสิ้นแล้ว ลำดับนี้จึงไม่ปลอดภัยสำหรับการตอบกลับที่ยังมีไบต์อยู่ในคิว:
ctx.writeAndFlush(response);
ctx.close();
เมื่อการแลกเปลี่ยน HTTP ถูกปิดโดยเจตนาหลังข้อความตอบกลับสุดท้าย ให้ผูกการปิดเข้ากับ future ของการเขียนนั้น:
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
ส่วนนี้สมมติว่าการตอบกลับถูกสร้างและใส่เฟรมอย่างถูกต้องแล้ว สำหรับบอดีที่สตรีม ให้ใช้การเสร็จสิ้นของข้อความสุดท้าย ไม่ใช่การเขียนส่วนหัว สำหรับการเชื่อมต่อ HTTP แบบต่อเนื่อง อย่าเพิ่มการปิดเพียงเพราะการตอบกลับจบลง
ตรวจสอบความล้มเหลวของ future เป็นส่วนหนึ่งของการจัดการข้อผิดพลาดตามปกติของแอปพลิเคชัน การเสร็จสิ้นรวมถึงความล้มเหลวและการยกเลิก ดังนั้นการเสร็จสิ้นเพียงอย่างเดียวไม่ใช่ใบยืนยันการส่งจากเบราว์เซอร์
การเปรียบเทียบที่มีประโยชน์คือความยาวการตอบกลับทั้งหมดและผลลัพธ์ของการเขียนในแต่ละเส้นทาง พร็อกซีสามารถเปลี่ยนเวลาได้มากพอที่จะเผยข้อผิดพลาดวงจรชีวิตที่มีอยู่แล้ว การมีอยู่ของมันไม่ได้พิสูจน์ว่าตัวบีบอัดหรือแคชของมันทิ้งไบต์เหล่านั้น