ผมสรุปเหตุการณ์การส่ง push notification ซ้ำและกระบวนการแก้ไขที่เจอระหว่างดูแลแอปพยากรณ์คลื่นสำหรับเล่นเซิร์ฟในฐานะนักพัฒนาคนเดียว
เป็นฟีเจอร์ทั่วไปที่ส่งการแจ้งเตือนไปยังผู้ใช้เมื่อเงื่อนไขบางอย่างครบถ้วน แต่ทุกครั้งที่ deploy เซิร์ฟเวอร์ใหม่
ปัญหา "การแจ้งเตือนที่ส่งไปแล้ว" ถูกส่งออกไปอีกก็เกิดซ้ำ
■ ปัญหา
- ทุกครั้งที่ deploy/restart ใหม่ การแจ้งเตือนเดิมถูกส่งซ้ำ
- บนเครื่อง local แทบ reproduce ไม่ได้ และมักเกิดเฉพาะหลัง deploy ทันที ทำให้หาสาเหตุได้ยาก
■ สาเหตุ
- เก็บสถานะป้องกันการซ้ำ (dedup) ไว้เฉพาะในหน่วยความจำของเซิร์ฟเวอร์
- เมื่อ deploy ใหม่ process ถูกเริ่มขึ้นใหม่ สถานะนั้นจึงถูก reset ทั้งหมด → กลายเป็นเหมือน "ยังไม่ได้ส่ง" แล้วส่งซ้ำ
■ วิธีแก้
- เปลี่ยนเป็นโครงสร้างที่เติม dedup key กลับมาจาก DB ตอนบูต (seed-on-boot) → คงสถานะไว้ได้แม้ deploy ใหม่
- พบอีกว่ารูปแบบ 'แจ้งเตือนเฉพาะตอนที่เงื่อนไขเปลี่ยน' ทำให้พลาดการเปลี่ยนแปลงของค่าน้ำหนักระหว่างนั้น
→ เปลี่ยนเป็นวิธีสะสมเหตุผลแล้วค่อย ๆ ยกระดับเป็นขั้น ๆ (escalation) - จัดระเบียบ FCM token ตามหลัก 1 อุปกรณ์ 1 token (รวมถึงการต่ออายุ token และการจัดการ token ซ้ำ)
■ บทเรียน
- ถ้าเก็บสถานะที่ "ต้องเกิดแค่ครั้งเดียว" อย่าง dedup ของการแจ้งเตือนไว้เฉพาะใน memory การ deploy ก็จะกลายเป็นบั๊กทันที
- ควรออกแบบ lifecycle ของสถานะโดยอิง persistent storage ไม่ใช่ process
- การตัดสิน trigger โดยอิง 'สถานะปัจจุบัน' มักพลาดน้อยกว่าการอิง 'จังหวะที่เกิดการเปลี่ยนผ่าน'
เป็นกรณีใช้งานจริงที่น่าดูไว้สำหรับคนที่ทำงานกับ server push/notification, cron/batch และ logic ป้องกันการซ้ำ
ยังไม่มีความคิดเห็น