𝗣𝗿𝗼𝗹𝗼𝗴𝘂𝗲 𝗮𝗻𝗱 𝗘𝗽𝗶𝗹𝗼𝗴𝘂𝗲 𝗠𝗮𝗰𝗿𝗼𝘀 𝗶𝗻 𝗛𝘆𝗽𝗲𝗿𝗹𝗮𝗻𝗲

Middleware คือกระดูกสันหลังของการประมวลผล request ใน Hyperlane คนส่วนใหญ่ใช้ middleware สำหรับ request และ response มาตรฐาน อย่างไรก็ตาม Hyperlane มี prologue และ epilogue macros แบบพิเศษเพื่อการควบคุมที่มากขึ้น

Macros เหล่านี้จะทำงานที่จุดเริ่มต้นและจุดสิ้นสุดของ request lifecycle ช่วยให้คุณควบคุมได้ว่าข้อมูลจะส่งถึง client เมื่อใดอย่างแม่นยำ

The Request Lifecycle:

• Request มาถึง: เซิร์ฟเวอร์ได้รับ HTTP request • ช่วง Prologue: คุณส่งข้อมูลเริ่มต้น เช่น headers หรือ status codes • Middleware chain: ฟังก์ชันต่างๆ ประมวลผล request • Route handler: ระบบสร้าง response • Response middleware: ฟังก์ชันต่างๆ ประมวลผล response • ช่วง Epilogue: ข้อมูลสุดท้ายจะถูก flush ไปยัง client และการเชื่อมต่อจะถูกปิดลง

ใช้ macros เหล่านี้เพื่อจัดการขั้นตอนที่ 2 และ 6

The Send Macros:

ใช้ #[try_send] สำหรับข้อมูลที่ไม่สำคัญ (non-critical) หากการเชื่อมต่อขาดหายไป มันจะจัดการข้อผิดพลาดโดยไม่ทำให้ระบบล่ม (crash) ซึ่งเหมาะสำหรับการทำ streaming ที่การสูญเสียข้อมูลบางส่วน (chunk) ไปนั้นไม่เป็นปัญหา

ใช้ #[send] สำหรับข้อมูลที่สำคัญ เพื่อให้มั่นใจว่าข้อมูลจะถูกส่งออกไปได้อย่างแน่นอน

The Flush Macros:

ใช้ #[try_flush] เพื่อพยายามล้าง buffer และจัดการข้อผิดพลาดอย่างราบรื่น

ใช้ #[flush] เพื่อบังคับให้ส่งข้อมูลทั้งหมดที่อยู่ใน buffer ไปยัง client ใช้สิ่งนี้เพื่อป้องกันข้อมูลสูญหายก่อนที่จะปิดการเชื่อมต่อ

Best Practices:

  • ใช้ #[try_send] สำหรับข้อมูลแบบ streaming เพื่อหลีกเลี่ยงการ crash เมื่อการเชื่อมต่อขาดหาย
  • ใช้ #[send] เมื่อการส่งข้อมูลเป็นเรื่องจำเป็นที่ต้องสำเร็จ
  • ควร flush buffer เสมอก่อนปิดการเชื่อมต่อ
  • ตรวจสอบ stream.is_keep_alive() ใน epilogue ของคุณเพื่อจัดการการนำการเชื่อมต่อกลับมาใช้ใหม่ (connection reuse)
  • ใช้ macros เหล่านี้สำหรับ Server-Sent Events (SSE) เพื่อส่งข้อมูลอัปเดตแบบเรียลไทม์
  • จัดการข้อผิดพลาดจากการ send และ flush ทั้งหมดเพื่อป้องกันความล้มเหลวของระบบ

เครื่องมือเหล่านี้ช่วยให้คุณควบคุมการไหลของข้อมูล (data flow) และจังหวะเวลาของ response ได้อย่างแม่นยำ

Source: https://dev.to/tengxgfyrz67s/prologue-and-epilogue-macros-1n29 Project Code: https://github.com/hyperlane-dev/hyperlane