1 คะแนน โดย whaletail 3 시간 전 | ยังไม่มีความคิดเห็น | แชร์ทาง WhatsApp

ผมสรุปเหตุการณ์การส่ง 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 ป้องกันการซ้ำ

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น