คู่มือปฏิบัติจริงการสร้างตัวรับ Webhook ระดับโปรดักชัน
เจาะลึกวิธีออกแบบ พัฒนา ทดสอบ และปรับใช้ระบบรับ Webhook ให้มีความปลอดภัยและรองรับการใช้งานจริงในระดับองค์กร

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เพิ่ม POST endpoint สำหรับจัดการคำขอและเก็บ URL ไว้ใน environment variables
- ตรวจสอบความถูกต้องของข้อมูลทุก payload ก่อนนำไปประมวลผล
- ใช้ idempotency key เพื่อป้องกันการประมวลผลเหตุการณ์ซ้ำซ้อน
- ตอบกลับผู้ส่งอย่างรวดเร็วและใช้ background worker ประมวลผลเบื้องหลัง
บทความนี้กลั่นกรองมาจากประสบการณ์การออกแบบและพัฒนาตัวจัดการ webhook มาแล้วนับสิบคันตั้งแต่ระบบชำระเงิน ระบบติดตามการจัดส่ง ไปจนถึงระบบแชทและบริการคริปโต โดยเน้นย้ำว่าแม้ผู้ให้บริการแต่ละรายจะมีกฎเกณฑ์ กลไกการยืนยันตัวตน และนโยบายการลองส่งซ้ำที่แตกต่างกัน แต่พื้นฐานหลักการที่สำคัญยังคงเหมือนกันทุกประการ
หากคุณต้องการศึกษาหัวข้อนี้ในเชิงลึกและนำแนวทางเหล่านี้ไปปรับใช้จริง ผู้เขียนได้สร้างที่เก็บโค้ดชื่อ webhook-consumer-handbook ขึ้นมา ซึ่งภายในประกอบด้วยรูปแบบการปฏิบัติจริงสำหรับการสร้างตัวรับ webhook ตัวอย่างการใช้งาน และทักษะ AI ที่นำกลับมาใช้ใหม่ได้
สำหรับความหมายอย่างเป็นทางการ คุณสามารถศึกษาเพิ่มเติมได้จากวิกิพีเดีย แต่หากอธิบายตามความเข้าใจง่าย Webhook คือกระบวนการที่เซิร์ฟเวอร์หนึ่งส่งการแจ้งเตือนไปยังอีกเซิร์ฟเวอร์หนึ่ง เพื่อสื่อสารข้อมูลเกี่ยวกับเหตุการณ์เฉพาะที่เกิดขึ้น ตัวอย่างเช่น เมื่อมีผู้สั่งซื้อสินค้าผ่านระบบอีคอมเมิร์ซ ข้อมูลคำสั่งซื้อนั้นจะต้องถูกจัดเก็บลงในฐานข้อมูลพร้อมทั้งส่งอีเมลยืนยันไปยังผู้ใช้ ซึ่งกรณีนี้คือจังหวะที่ควรใช้งาน webhook
ขั้นตอนแรกในการสร้างตัวรับ webhook ที่ดีคือการเพิ่ม POST endpoint บนเซิร์ฟเวอร์ของคุณเพื่อจัดการคำขอ โดยต้องเลือกชื่อภายในสำหรับ URL ที่สมเหตุสมผล และเก็บ URL นี้ไว้ใน environment variables แทนที่จะฝังไว้ในโค้ดโดยตรง เพื่อให้สามารถอัปเดตชื่อ webhook ได้ทันทีโดยไม่ต้อง redeploy แอปพลิเคชันใหม่หากเกิดปัญหาฝั่งผู้ให้บริการ นอกจากนี้ เซิร์ฟเวอร์จะต้องรองรับ TLS เพื่อป้องกันการโจมตีแบบ man-in-the-middle และควรรับคำขอเฉพาะจากเซิร์ฟเวอร์ที่เชื่อถือได้เท่านั้น

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
การแยกเก็บ URL ไว้ใน environment variables ถือเป็นแนวปฏิบัติที่ดีเยี่ยมในด้าน DevOps ช่วยให้ทีมพัฒนาสามารถย้ายหรือเปลี่ยนปลายทางของระบบรับข้อมูลได้อย่างยืดหยุ่นโดยไม่ต้องแก้ไขและคอมไพล์โค้ดใหม่ทั้งหมด ซึ่งช่วยลด Downtime ในสถานการณ์ฉุกเฉินได้อย่างมีประสิทธิภาพ
สำหรับการยืนยันคำขอที่เข้ามา คุณสามารถใช้วิธีการยืนยันตัวตนที่หลากหลาย พร้อมทั้งจัดเก็บโทเค็น รหัสผ่าน และกุญแจสำคัญไว้ในระบบจัดการความลับเฉพาะอย่าง AWS Secrets Manager โดยห้ามฝังไว้ในโค้ดหรือพุชขึ้น repository เด็ดขาด
คุณต้องถือว่าข้อมูล payload ทุกชิ้นเป็นสิ่งที่ไม่น่าเชื่อถือและต้องตรวจสอบความถูกต้องก่อนประมวลผลหรือบันทึก โดยแนะนำให้แปลงข้อมูลเข้ามาใน validator classes หรือ DTO objects เพื่อให้แอปพลิเคชันทำงานกับโครงสร้างข้อมูลที่คาดเดาได้ หากข้อมูลไม่ผ่านการตรวจสอบ ควรส่งคืนข้อผิดพลาดระดับ 400 Bad Request และบันทึก Log ไว้
ผู้ให้บริการ webhook อาจส่งเหตุการณ์เดิมซ้ำมากกว่าหนึ่งครั้งเนื่องจากปัญหาเครือข่ายหรือการลองส่งใหม่ ระบบรับจึงควรจัดการกรณีนี้เป็นเรื่องปกติโดยใช้ idempotency key ซึ่งมักจะมาพร้อมกับ event ID เพื่อตรวจสอบว่าเหตุการณ์นั้นถูกยอมรับหรือประมวลผลไปแล้วหรือยัง สำหรับการใช้งานแคช ควรตั้งอายุให้มีอย่างน้อยเท่ากับหน้าต่างการลองส่งซ้ำของผู้ให้บริการ และในกรณีที่อ่อนไหวต่อการเงินควรเก็บบันทึกไว้อย่างถาวรในฐานข้อมูล
เหตุการณ์อาจมาถึงไม่เรียงตามลำดับ เหตุการณ์เก่าอาจมาถึงทีหลังเหตุการณ์ใหม่ ดังนั้นตัวรับไม่ควรเขียนทับสถานะปัจจุบันด้วยข้อมูลล่าสุดเสมอไป ให้บันทึกรายละเอียดและเวลา พร้อมทั้งตรวจสอบว่าเหตุการณ์ใหม่กว่าจริงหรือไม่ก่อนปรับปรุงข้อมูล และควรบันทึกการเปลี่ยนแปลงธุรกิจพร้อมกับบันทึก idempotency ลงในฐานข้อมูลเดียวกันผ่าน transaction เดียวกัน
คำขอ webhook ไม่ควรขึ้นอยู่กับการประมวลผลธุรกิจที่ใช้เวลานานก่อนที่จะตอบกลับผู้ให้บริการ ระบบควรบันทึกเหตุการณ์ที่ผ่านการตรวจสอบลงในที่จัดเก็บข้อมูลก่อน จากนั้นจึงส่งการตอบกลับที่สำเร็จและให้ background worker นำไปประมวลผลต่อ พร้อมทั้งจัดให้มีระบบ Log และการตรวจสอบเพื่อสามารถเรียกเล่นซ้ำเหตุการณ์ที่ล้มเหลวได้
ในขั้นตอนการพัฒนา คุณสามารถใช้เครื่องมือทำทันเนลอย่าง ngrok หรือ localtunnel เพื่อเปิดเผยเซิร์ฟเวอร์ภายในเครื่องผ่าน URL สาธารณะชั่วคราว ทำให้สามารถทดสอบส่งเหตุการณ์จากผู้ให้บริการและตรวจสอบคำขอผ่าน Log ในเครื่องได้อย่างสะดวกรวดเร็ว
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น