คู่มือปฏิบัติเมื่อเกิดเหตุสำหรับแอพโนโค้ด: ตรวจจับ แยกประเภท และกู้คืน
ใช้ runbook เหตุการณ์สำหรับแอพโนโค้ดนี้เพื่อค้นหาปัญหาเร็ว แยกผลกระทบ กู้คืนอย่างปลอดภัย สื่อสารชัดเจน และป้องกันไม่ให้เกิดซ้ำ

สิ่งที่คู่มือฉบับนี้คือและควรใช้เมื่อไหร่
เหตุการณ์ (incident) คือปัญหาที่ไม่คาดคิดซึ่งทำให้ผู้คนใช้งานแอพของคุณไม่ได้ ช้ามาก หรือเสี่ยงต่อข้อมูล ในแอพโนโค้ด หน้าตาเหตุการณ์อาจเป็นการล็อกอินล้มเหลวอย่างฉับพลัน หน้าจอพังหลังเปลี่ยนแปลง ออโตเมชันพื้นหลังหยุดทำงาน ข้อผิดพลาดของ API หรือเวิร์กโฟลว์ที่ “สำเร็จ” แต่เงียบ ๆ เขียนค่าผิดลงฐานข้อมูล
คู่มือที่เป็นลายลักษณ์อักษรจะเปลี่ยนช่วงเวลาที่ตึงเครียดให้เป็นชุดของการกระทำเล็ก ๆ และชัดเจน ลดการเดา ตัดสินใจได้เร็วขึ้น (เช่น ควรย้อนกลับไหม) และช่วยให้ทุกคนใช้ข้อเท็จจริงเดียวกัน ความล่าช้าส่วนใหญ่ระหว่างเหตุการณ์ไม่ใช่เรื่องเทคนิค แต่เกิดจากความไม่แน่ใจ: มันจริงไหม ใครเป็นผู้นำ มีอะไรเปลี่ยนไป เราจะสื่อกับผู้ใช้ว่าอย่างไร
playbook นี้สำหรับทุกคนที่เกี่ยวข้องเมื่อเกิดปัญหา: ผู้สร้างที่ปล่อยการเปลี่ยนแปลง เจ้าของระบบหรือแพลตฟอร์มที่จัดการการ deploy และสิทธิ์ ทีมซัพพอร์ตที่ได้ยินรายงานแรก และเจ้าของผลิตภัณฑ์หรือธุรกิจที่ประเมินผลกระทบและลำดับความสำคัญ
มันจงใจทำให้เบา เหมาะกับทีมที่สร้างบนแพลตฟอร์มเช่น AppMaster ซึ่งคุณอาจมีลอจิกเชิงภาพ บริการที่สร้างอัตโนมัติ และตัวเลือกการ deploy หลายแบบ
ครอบคลุมวงจรเหตุทั้งหมด: ตรวจจับและยืนยันปัญหาจริง แยกประเภทอย่างรวดเร็ว ทำให้เสถียรและกู้คืน (รวมการตัดสินใจ rollback) สื่อสารระหว่างการหยุดชะงัก แล้วทำทบทวนสั้นหลังเหตุเพื่อให้ปัญหาเดิมเกิดซ้ำน้อยลง
มันไม่ครอบคลุมการออกแบบสถาปัตยกรรมระยะยาว การตรวจพิสูจน์ทางด้านความปลอดภัยอย่างลึก หรือกระบวนการปฏิบัติตามกฎระเบียบที่ซับซ้อน หากคุณจัดการข้อมูลที่ถูกควบคุมหรือโครงสร้างพื้นฐานที่สำคัญ ให้เพิ่มขั้นตอนที่เข้มงวดยิ่งขึ้นบนคู่มือนี้
ก่อนจะมีอะไรพัง: กำหนดฐานปกติและบทบาท
เหตุการณ์รู้สึกวุ่นวายเมื่อคุณไม่รู้ว่า “ปกติ” เป็นอย่างไร กำหนดฐานปกติไว้เพื่อให้ทีมสังเกตปัญหาได้เร็วขึ้น สำหรับแอพโนโค้ด สัญญาณแรกมักมาจากผสมผสานของสุขภาพแพลตฟอร์ม เมตริกทางธุรกิจ และรายงานจากคนจริง
จดสัญญาณที่คุณจะเฝ้าดูทุกวัน ไม่ใช่แค่เวลาที่เกิดการหยุดชะงัก ตัวอย่างทั่วไปได้แก่ uptime, อัตราข้อผิดพลาด, หน้าจอช้า, การล็อกอินล้มเหลว, การชำระเงินล้มเหลว และการพุ่งขึ้นของตั๋วซัพพอร์ตหรือข้อความจากผู้ใช้
กำหนดความรุนแรงด้วยภาษาที่เข้าใจง่ายเพื่อให้ใครก็ใช้ได้:
- SEV1: ผู้ใช้ส่วนใหญ่ใช้งานแอพไม่ได้ หรือเงิน/ความปลอดภัย/ข้อมูลตกอยู่ในความเสี่ยง
- SEV2: ฟีเจอร์สำคัญเสีย แต่มีทางเลี่ยงได้
- SEV3: ปัญหาเล็ก ขอบเขตจำกัด หรือเป็นเรื่องความสวยงาม
ตั้งเป้าตอบสนองที่ช่วยสร้างแรงผลักดัน ตัวอย่างเป้าหมาย: ตอบรับภายใน 5 นาที โพสต์อัปเดตแรกภายใน 15 นาที และมุ่งมั่นให้เสถียรภายใน 60 นาที (แม้ว่าการแก้เต็มอาจใช้เวลานานกว่า)
ตัดสินบทบาทก่อนที่คุณจะต้องใช้มัน ตั้งชื่อว่าใครประกาศเหตุการณ์ ใครเป็นผู้นำ และใครเป็นสำรองถ้าคนนั้นออฟไลน์ ในทีม AppMaster มักเป็นคนที่เป็นเจ้าของลอจิก Business Process พร้อมกับสำรองที่จัดการการ deploy หรือ export ได้
สุดท้าย เก็บที่เดียวร่วมกันสำหรับบันทึกเหตุการณ์ ใช้วันเวลาสำหรับทุกการกระทำ (อะไรเปลี่ยน เมื่อไหร่ โดยใคร) เพื่อให้คุณสามารถสร้างเรื่องราวย้อนหลังโดยไม่ต้องเดา
ตรวจจับและยืนยัน: มันจริงไหม และรุนแรงแค่ไหน
ยืนยันผลกระทบก่อนจะจ้องดูแดชบอร์ด ถามคำถามชัดเจนข้อเดียว: ตอนนี้ใครทำอะไรไม่ได้บ้าง? “ทีมซัพพอร์ตเปิดตั๋วไม่ได้” มีประโยชน์กว่าการบอกว่า “แอพช้า” ถ้าเป็นไปได้ ให้ทำซ้ำปัญหาโดยใช้บทบาทและอุปกรณ์เดียวกับผู้ใช้ที่ได้รับผลกระทบ
ถัดไป วัดขอบเขตว่ากว้างแค่ไหน เป็นบัญชีเดียว ช่วงลูกค้า หรือทุกคน? แยกแบบด่วน: ภูมิภาค ประเภทบัญชี เว็บ vs โมบาย ฟีเจอร์เดียว vs ทั้งแอพ ในเครื่องมือโนโค้ด บางสิ่งอาจดูเป็นปัญหาทั่วโลก แต่จริง ๆ แล้วเป็นกฎสิทธิ์หรือหน้าจอเดียวที่พัง
แล้วเช็กอะไรที่เปลี่ยนไป ย้อนกลับ 1-2 ชั่วโมงหา release สวิตช์คอนฟิก แก้สคีมาฐานข้อมูล หรือการนำเข้าข้อมูล ในแพลตฟอร์มอย่าง AppMaster การเปลี่ยนแปลง Business Process โมเดลข้อมูล หรือการตั้งค่า auth อาจกระทบหลายฟลูว์พร้อมกัน แม้ UI จะยังดูปกติก็ตาม
ก่อนที่จะโทษแอพ ให้ตัดความเป็นไปได้ของการพึ่งพาภายนอก ผู้ให้บริการอีเมล/SMS การชำระเงิน (เช่น Stripe) และการรวมระบบ (Telegram, AWS services, AI APIs) อาจล้มหรือจำกัดอัตรา หากแอพพังเฉพาะตอนส่งข้อความหรือเรียกเก็บเงิน ปัญหาอาจมาจาก upstream
ใช้เช็คลิสต์ตัดสินใจง่าย ๆ:
- Monitor หากผลกระทบต่ำและข้อผิดพลาดไม่เพิ่ม
- Mitigate now หากผู้ใช้ถูกบล็อกจากงานหลักหรือข้อมูลเสี่ยง
- Declare an incident หากปัญหากว้าง ไวต่อเวลา หรือไม่ชัดเจน
- Escalate หากปัญหาเกี่ยวกับการชำระเงิน การพิสูจน์ตัวตน หรือข้อมูล production
- Set a check-in time (เช่น ทุก 15 นาที) เพื่อให้ทีมไม่หลุดโฟกัส
เมื่อคุณจำแนกความรุนแรงและขอบเขตได้ คุณก็สามารถไปจาก “มันจริงไหม?” เป็น “เราทำอะไรเป็นอันดับแรก?” โดยไม่ต้องเดา
การแยกประเภททีละขั้นตอน (30 นาทีแรก)
เปิดบันทึกเหตุการณ์ทันที ตั้งชื่อตรงไปตรงมาที่บอกผลกระทบต่อผู้ใช้ ไม่ใช่สาเหตุที่สงสัย (เช่น “การชำระเงินล้มเหลวสำหรับลูกค้า EU”) เขียนเวลาที่เริ่ม (การแจ้งเตือนแรกหรือรายงานแรก) นี่จะเป็นที่เดียวสำหรับการตัดสินใจ วันเวลา และสิ่งที่เปลี่ยน
มอบหมายบทบาทเพื่อให้การทำงานไม่ทับซ้อน แม้ในทีมเล็ก การตั้งเจ้าของช่วยลดความผิดพลาดเมื่อความเครียดสูง ขั้นต่ำคุณต้องการ:
- Incident lead: รักษาโฟกัส กำหนดลำดับความสำคัญ ตัดสินใจระหว่างกักกันกับย้อนกลับ
- Fixer: สืบสวนและปรับแก้
- Comms: โพสต์อัปเดตให้ผู้มีส่วนได้ส่วนเสียและซัพพอร์ต
- Note taker: บันทึกการกระทำ เวลา และผลลัพธ์
ระบุสองสิ่งเป็นลายลักษณ์อักษร: สิ่งที่รู้แน่นอน และสมมติฐานปัจจุบันของคุณ “ที่รู้” อาจเป็น: อัตราข้อผิดพลาดพุ่ง จุด endpoint ใดพัง โมบายเท่านั้นที่ได้รับผล สมมติฐานอาจผิด แต่ควรนำทางการทดสอบถัดไป อัปเดตทั้งสองสิ่งเมื่อเรียนรู้
ขณะที่ระบบไม่เสถียร ให้ตั้งรอบอัปเดต 15 นาที หากไม่มีอะไรเปลี่ยน ให้รายงานแบบนั้น การอัปเดตสม่ำเสมอหยุดการคุยข้างทางและป้องกันการทักถามซ้ำว่า “มีข่าวไหม?”
เลือกการกระทำกักกันแรก เป้าหมายคือบรรเทาความเสียหายทันที แม้สาเหตุจะยังไม่ชัด ตัวเลือกแรกที่พบบ่อยได้แก่ หยุดงานแบ็กกราวด์ ชั่วคราวปิดฟีเจอร์เสี่ยง จำกัดทราฟฟิกไปยังโมดูล หรือสลับไปยังคอนฟิกที่รู้ว่าปลอดภัย ใน AppMaster นี่มักหมายถึงปิด flow บางตัวใน Business Process Editor หรือซ่อนเส้นทาง UI ที่กระตุ้นความล้มเหลวนั้นชั่วคราว
หากการกักกันไม่ปรับปรุงเมตริกภายในหนึ่งรอบ ให้เริ่มวางแผน rollback พร้อมกัน
ทำให้เสถียรก่อน: กักกันผลกระทบ
เมื่อยืนยันว่าเป็นเหตุการณ์จริง ให้เปลี่ยนจาก “หาจุดบั๊ก” เป็น “หยุดเลือดไหล” การทำให้เสถียรจะซื้อเวลา ปกป้องผู้ใช้ รายได้ และข้อมูลในขณะที่สืบสวน
เริ่มด้วยการเปลี่ยนแปลงเล็กที่สุดที่ลดความเสียหาย การกักกันมักเร็วกว่าการแก้เต็มเพราะคุณสามารถปิดฟีเจอร์ใหม่ หยุดเวิร์กโฟลว์ หรือบล็อกเส้นทางอินพุตที่เสี่ยง โดยไม่ต้อง rebuild
หากสงสัยว่าข้อมูลถูกทำลาย ให้หยุดการเขียนก่อน นั่นอาจหมายถึงปิดฟอร์มชั่วคราว หยุดออโตเมชันที่อัปเดตรายการ หรือบล็อก endpoint API ที่รับการอัปเดต การอ่านข้อมูลผิดเจ็บปวด แต่การเขียนข้อมูลผิดจะทวีความยุ่งยากในการทำความสะอาด
หากผู้ใช้ล็อกอินไม่ได้ ให้ถือว่าการล็อกอินเป็นลำดับความสำคัญสูงสุด ตรวจสอบการตั้งค่า authentication และ flow การล็อกอินก่อนอย่างอื่น การแก้ไขอื่นช้าเมื่อทีมและผู้ใช้เข้าถึงแอพไม่ได้
หากแอพช้าหรือ timeout ให้ลดโหลดและตัดเส้นทางที่แพง ปิดหน้าจอหนัก ๆ หยุดงานแบ็กกราวด์ และปิดการรวมระบบใหม่ที่เพิ่มคำขอ ใน AppMaster การกักกันอาจง่ายเพียงปิด Business Process ที่มีปัญหา หรือชั่วคราวลบ action บน UI ที่กระตุ้นสายงานที่หนัก
เก็บการกระทำให้ระมัดระวังและบันทึกไว้ ภายใต้ความกดดัน ทีมมักทำซ้ำขั้นตอนหรือย้อนการแก้โดยไม่ตั้งใจ เขียนทุกการเปลี่ยนแปลงและผลลัพธ์
ลำดับการทำให้เสถียรง่าย ๆ:
- หยุดการเขียนข้อมูลหากอาจมีการทำลายข้อมูล และยืนยันว่ารายการใหม่ไม่ถูกเปลี่ยนแปลงอีก
- ปิดฟีเจอร์ flag, ออโตเมชัน หรือการรวมระบบที่ใหม่ที่สุดที่อยู่ในไทม์ไลน์
- ปกป้องการเข้าถึง: คืนการล็อกอินและการไหลของ session ให้แอดมินก่อน แล้วจึงผู้ใช้ทั้งหมด
- ลดโหลดโดยหยุดงานแบตช์และตัดเส้นทางผู้ใช้ที่ช้าที่สุด
- บันทึกทุกการกระทำพร้อมวันเวลา เจ้าของ และผลที่สังเกตได้
คุณมุ่งไปที่ “ปลอดภัยและใช้งานได้” ไม่ใช่ “แก้สมบูรณ์” เมื่อผลกระทบถูกกัก คุณสามารถวิเคราะห์อย่างสงบและเลือก rollback หรือการแก้ที่เหมาะสม
ตัวเลือกการย้อนกลับและการตรวจสอบความเสี่ยง
เมื่อมีบางอย่างพัง ความเร็วสำคัญ แต่การกระทำที่ปลอดภัยที่สุดจะชนะ ปกติคุณมีสามทางเลือกที่ใช้ได้จริง: rollback, ปล่อยการแก้ข้างหน้า, หรือ revert جزئی (ปิดฟีเจอร์หนึ่งอย่างไว้และปล่อยส่วนที่เหลือ)
ก่อนอื่น ให้ชัดเจนว่า “rollback” หมายถึงอะไรในสภาพแวดล้อมของคุณ อาจหมายถึงการ deploy เวอร์ชันก่อนหน้า ย้อนคอนฟิก หรือกู้คืนสถานะฐานข้อมูล ในแพลตฟอร์มอย่าง AppMaster “เวอร์ชัน” อาจรวมลอจิกแบ็กเอนด์, เว็บ UI, build มือถือ และการตั้งค่าสภาพแวดล้อม
ใช้การเช็กความเสี่ยงเหล่านี้เพื่อตัดสินใจว่า rollback ปลอดภัยไหม:
- การเปลี่ยนสคีมาฐานข้อมูล: rollback อาจล้มเหลวถ้าเวอร์ชันเก่าคาดหวังตารางหรือฟิลด์ต่างกัน
- การเขียนข้อมูลที่ไม่สามารถย้อนกลับได้: คืนเงิน สถานะ หรือข้อความที่ส่งออกแล้วอาจย้อนกลับไม่ได้
- งานคิวและ webhook: ลอจิกเก่าอาจประมวลผลรายการซ้ำหรือล้มเหลวกับ payload ใหม่
- การพึ่งพาภายนอก: การรวมระบบการชำระเงิน อีเมล/SMS หรือ Telegram อาจมีพฤติกรรมเปลี่ยนไป
ตั้งกฎง่าย ๆ ก่อนแตะอะไร เลือกเมตริก 2-3 อย่างที่ต้องดีขึ้นภายใน 10-15 นาทีหลังการกระทำ เช่น อัตราข้อผิดพลาด การล็อกอินสำเร็จ การชำระเงินสำเร็จ หรือ latency ของ API หากเมตริกไม่เคลื่อนไปในทิศทางที่ถูกต้อง ให้หยุดและเปลี่ยนกลยุทธ์
วางแผนการยกเลิกการย้อนกลับด้วย รู้ว่าคุณจะย้อนกลับอย่างไรถ้าเวอร์ชันเก่าก่อปัญหาใหม่: build ไหนต้อง redeploy คอนฟิกใดต้องคืนค่า และใครอนุมัติการเปลี่ยนแปลงลำดับที่สอง เก็บคนเดียวเป็นผู้รับผิดชอบการตัดสินใจสุดท้ายจะช่วยให้ไม่เปลี่ยนทิศกลางทาง
การสื่อสารระหว่างเหตุการณ์
ความเงียบทำให้เหตุการณ์แย่ลง ใช้วิธีง่าย ๆ และทำซ้ำได้เพื่อให้คนรับรู้ขณะที่ทีมสืบสวน
เริ่มจากอัปเดตภายใน แจ้งคนที่จะได้รับคำถามก่อน และคนที่ลบอุปสรรคได้ ให้สั้นและข้อเท็จจริง ปกติคุณต้องแจ้ง:
- ซัพพอร์ตหรือความสำเร็จลูกค้า: ผู้ใช้เห็นอะไรและต้องบอกอะไรตอนนี้
- ฝ่ายขายหรือทีมบัญชี: บัญชีไหนได้รับผลกระทบและห้ามสัญญาอะไร
- ผู้สร้าง/วิศวกรรม: มีอะไรเปลี่ยน ย้อนกลับอะไร ใครกำลังทำงาน
- ผู้ติดต่อระดับผู้บริหาร: ผลกระทบ ความเสี่ยง เวลาอัปเดตถัดไป
- เจ้าของเดียวที่อนุมัติข้อความภายนอก
สำหรับอัปเดตภายนอก ยึดสิ่งที่รู้ หลีกเลี่ยงการเดาสาเหตุหรือโทษพาร์ทเนอร์ ผู้ใช้ต้องการสามสิ่งหลัก: การยืนยัน ผลกระทบ และเวลาอัปเดตครั้งต่อไป
แม่แบบข้อความง่าย ๆ
เก็บบรรทัดสถานะเดียวให้สอดคล้องในทุกช่องทาง:
- Status: Investigating | Identified | Mitigating | Monitoring | Resolved
- Impact: “ผู้ใช้บางส่วนล็อกอินไม่ได้” หรือ “การชำระเงินล้มเหลวสำหรับคำสั่งใหม่”
- Workaround: “ลองอีกครั้งใน 10 นาที” หรือ “ใช้แอพมือถือในช่วงเว็บล่ม” (ก็ต่อเมื่อจริง)
- Next update: “อัปเดตถัดไปเวลา 14:30 UTC”
ถ้าผู้ใช้โกรธ ยอมรับก่อน แล้วเจาะจง: “เราทราบว่าการชำระเงินล้มเหลวสำหรับลูกค้าบางคน เรากำลังย้อนกลับการเปลี่ยนแปลงล่าสุดตอนนี้ จะอัปเดตอีกครั้งใน 30 นาที” อย่าสัญญาเดดไลน์ เครดิต หรือการแก้ถาวรระหว่างเหตุการณ์
แก้เสร็จ vs เฝ้าดู
ประกาศ resolved เมื่ออาการหลักหายไปและการตรวจสอบสำคัญสะอาด (ล็อกอิน, ฟลูว์หลัก, อัตราข้อผิดพลาด) ใช้ monitoring เมื่อคุณใช้การแก้ (เช่น ย้อนกลับการ deploy หรือคืนค่าคอนฟิก) แต่ยังต้องเฝ้าดูซ้ำ ระบุสิ่งที่จะเฝ้าดู ระยะเวลา และเวลาอัปเดตสุดท้าย
วินิจฉัยสาเหตุ: การตรวจสอบด่วนที่ช่วยแคบลง
เมื่อระบบเสถียรแล้ว ให้เปลี่ยนจากดับไฟเป็นเก็บหลักฐานเล็ก ๆ ที่อธิบายอาการได้ เป้าหมายไม่ใช่รากเหตุที่สมบูรณ์แบบ แต่เป็นสาเหตุที่น่าจะเป็นซึ่งคุณสามารถดำเนินการได้โดยไม่ทำให้เหตุการณ์แย่ลง
อาการต่างกันชี้ไปหาผู้ต้องสงสัยต่างกัน หน้าช้าบ่อยมาจาก query ฐานข้อมูลช้า การจู่โจมทราฟฟิก หรือบริการภายนอกช้าลง Timeout อาจมาจาก process ค้าง backend เกินพิกัด หรือ integration รอเกินเวลา การพุ่งขึ้นของข้อผิดพลาดหรือการ retry มักเกี่ยวกับการเปลี่ยนแปลงล่าสุด อินพุตไม่ถูกต้อง หรือ outage จาก upstream
การตรวจสอบด่วน (15 นาที)
ทำหนึ่งเส้นทางผู้ใช้จริงจากต้นจนจบด้วยบัญชีทดสอบ นี่มักให้สัญญาณเร็วเพราะแตะ UI, ลอจิก, ฐานข้อมูล และ integration
มุ่งที่การตรวจ:
- ทำซ้ำการใช้งานหนึ่งครั้ง: ล็อกอิน ทำงานสำคัญ และยืนยันผล
- ระบุขั้นตอนที่ช้า/ล้มเหลว: โหลดหน้า, เรียก API, บันทึกฐานข้อมูล, webhook
- ตรวจข้อมูลล่าสุด: สแกน 20-50 รายการล่าสุดหาสำเนา ฟิลด์ขาด หรือยอดรวมผิด
- ยืนยันการรวมระบบ: พยายามชำระเงิน (เช่น Stripe), การส่ง webhook, และการส่งข้อความ (อีเมล/SMS หรือ Telegram)
- ยืนยันบริบทการเปลี่ยนแปลง: อะไรปล่อย ตั้งค่า หรือตย้ายก่อนการพุ่งขึ้น
ถ้าคุณใช้ AppMaster นี่มักแมปไปยังขั้นตอน Business Process, การเปลี่ยนแปลง Data Designer, หรือการตั้งค่า deployment
ตัดสิน: รักษาการกักกันไว้หรือแก้ข้างหน้า
ถ้าการตรวจเร็วชี้ผู้ต้องสงสัยชัด ให้เลือกการกระทำที่ปลอดภัยที่สุด: รักษามาตรการบรรเทาไว้ หรือใช้การแก้เล็ก ๆ ที่ถาวร เพียงเอา rate limits, feature toggles, หรือวิธีแก้ชั่วคราวออกเมื่อเส้นทางทดสอบสำเร็จสองครั้งและอัตราข้อผิดพลาดคงที่ไม่พุ่งขึ้น
ตัวอย่างสถานการณ์: การปล่อยล้มเหลวในเวลาทำการ
เป็น 10:15 น. วันอังคาร ทีมปล่อยการเปลี่ยนแปลงเล็ก ๆ ให้พอร์ทัลลูกค้าที่สร้างบน AppMaster ไม่กี่นาทีต่อมา ผู้ใช้เริ่มเห็นหน้าว่างหลังล็อกอินและคำสั่งใหม่หยุดเข้ามา
ซัพพอร์ตพบตั๋วสามรายการแจ้งข้อความเดียวกัน: “ล็อกอินได้ แต่พอร์ทัลไม่โหลด” ในขณะเดียวกันมอนิเตอร์แสดงการพุ่งของข้อผิดพลาด 500 บนเว็บแอพและการลดลงของการเรียก API ที่สำเร็จ คุณถือเป็นเหตุการณ์จริง
หัวหน้าเหตุทำการยืนยันด่วน: ล็อกอินด้วยบัญชีทดสอบทั้งเดสก์ท็อปและมือถือ และเช็กเวลาการ deploy ล่าสุด เวลาเข้ากับการปล่อย ดังนั้นสมมติว่าการเปลี่ยนล่าสุดเกี่ยวข้องจนกว่าจะพิสูจน์ได้ว่าไม่ใช่
30 นาทีแรกอาจเป็นแบบนี้:
- Contain: ใส่พอร์ทัลในโหมดบำรุงรักษา (หรือปิด feature flag ที่ได้รับผลกระทบชั่วคราว) เพื่อหยุดผู้ใช้จากการเข้าถึงฟลูว์ที่พัง
- Decide rollback: ถ้าความล้มเหลวเริ่มหลังการปล่อยและกระทบผู้ใช้จำนวนมาก ให้ย้อนกลับก่อน
- Communicate: โพสต์อัปเดตภายในสั้น ๆ (อะไรพัง ผลกระทบ กำลังทำอะไร เวลาอัปเดตถัดไป) ส่งข้อความลูกค้าว่าทราบปัญหาและกำลังแก้
- Recover: redeploy เวอร์ชันที่รู้ว่าดีล่าสุด (หรือย้อนคืนโมดูลเฉพาะ) ทดสอบล็อกอิน การโหลดแดชบอร์ด และการทำงานสำคัญเช่น “สร้างตั๋ว” หรือ “สั่งซื้อ”
- Monitor: เฝ้าดูอัตราข้อผิดพลาด การล็อกอินสำเร็จ และปริมาณตั๋วซัพพอร์ต 10-15 นาที ก่อนประกาศว่ายังคงเสถียร
ภายใน 10:40 น. ข้อผิดพลาดกลับสู่ปกติ คุณเฝ้าดูเมตริกขณะซัพพอร์ตยืนยันว่าตั๋วใหม่ลดลง
หลังจากนั้น ทีมทำทบทวนสั้น: อะไรจับปัญหาได้ก่อน (alerts vs support), อะไรทำให้ช้าลง (ไม่มีเจ้าของ ขั้นตอน rollback ไม่ชัด) และต้องเปลี่ยนอะไร ปรับปรุงที่พบบ่อยคือเพิ่ม smoke-test ก่อนปล่อยสำหรับสามฟลูว์สำคัญของพอร์ทัลและทำให้ rollback เป็นขั้นตอนเดียวที่เอกสารไว้
ความผิดพลาดที่พบบ่อยซึ่งทำให้เหตุการณ์แย่ลง
เหตุการณ์ส่วนใหญ่แย่ลงเพราะสองเหตุผล: คนปล่อยให้ระบบก่อความเสียหายต่อไปขณะสืบสวน หรือคนเปลี่ยนหลายอย่างเร็วเกินไป runbook นี้ออกแบบมาเพื่อปกป้องคุณจากทั้งสองอย่าง
กับดักที่พบบ่อยคือสืบสวนขณะที่แอพยังเขียนข้อมูลผิด หากเวิร์กโฟลว์ลูป integration โพสต์ซ้ำ หรือบั๊กสิทธิ์ให้คนผิดแก้ไขระเบียน ให้หยุดกระบวนการที่ก่อปัญหาก่อน ใน AppMaster นั่นอาจหมายถึงการปิด Business Process การปิดการรวมโมดูล หรือลดการเข้าถึงชั่วคราวเพื่อหยุดการแพร่
กับดักอีกอย่างคือ “แก้โดยการเดา” เมื่อหลายคนคลิกและเปลี่ยนการตั้งค่า คุณจะเสียไทม์ไลน์ แม้การแก้เล็กน้อยก็สำคัญในเหตุการณ์ ตกลงผู้ขับเคลื่อนเดียว เก็บบันทึกการเปลี่ยนแปลงง่าย ๆ และหลีกเลี่ยงการซ้อนการปรับแต่งบนสิ่งที่ไม่รู้
ข้อผิดพลาดที่ทำให้การหยุดนานขึ้นซ้ำ ๆ:
- สืบสวนก่อนและกักกันทีหลัง ขณะที่การเขียนข้อมูลผิดหรือการทำซ้ำกำลังดำเนินต่อ
- ทำหลายการเปลี่ยนพร้อมกันโดยไม่มีบันทึก ทำให้ไม่รู้ว่าการกระทำใดช่วยหรือล้มเหลว
- รอที่จะสื่อสาร หรือส่งอัปเดตคลุมเครือที่สร้างคำถามมากกว่าความเชื่อมั่น
- ย้อนกลับโดยไม่ตรวจสภาพฐานข้อมูลและงานคิว อีเมล หรือ webhook ที่รอดำเนินการ
- ปิดเหตุการณ์โดยไม่มีขั้นตอนยืนยันชัดเจน
การสื่อสารเป็นส่วนหนึ่งของการกู้คืน แบ่งปันสิ่งที่คุณรู้ สิ่งที่ไม่รู้ และเวลาที่จะอัปเดตต่อไป “เรากำลังย้อนกลับและจะยืนยันเหตุการณ์เรียกเก็บถูกต้องภายใน 15 นาที” ดีกว่า “เรากำลังตรวจสอบ”
อย่าปิดเหตุการณ์เพียงเพราะข้อผิดพลาดหยุด ตรวจสอบด้วยเช็คลิสต์สั้น ๆ: หน้าจอสำคัญโหลดได้ รายการใหม่บันทึกถูกต้อง ออโตเมชันสำคัญทำงานหนึ่งครั้ง และ backlog (คิว retry งานตามกำหนด) ถูกระบายหรือถูกพักอย่างปลอดภัย
เช็คลิสต์ด่วนที่ใช้ภายใต้ความกดดัน
เมื่อสิ่งพัง สมองของคุณจะพยายามทำสิบอย่างพร้อมกัน ใช้รายการนี้เพื่อสงบใจ รักษาความปลอดภัย และคืนบริการ
ปักหมุดส่วนนี้ให้ทีมเห็นจริง
- ยืนยันว่ามันจริงและกำหนดขอบเขต (5 นาที): ตรวจสอบว่า alerts ตรงกับสิ่งที่ผู้ใช้รายงาน เขียนว่ามีอะไรล้มเหลว (ล็อกอิน เช็คเอาต์ แผงแอดมิน) ใครได้รับผลกระทบ และตั้งแต่เมื่อไร หากทำได้ ให้ทำซ้ำใน session สะอาด (โหมดไม่ระบุตัวตนหรือบัญชีทดสอบ)
ใช้หนึ่งนาทีตั้งชื่อเจ้าของเหตุ หนึ่งคนตัดสินใจ คนอื่นสนับสนุน
-
ทำให้เสถียรและกักกัน (10 นาที): หยุดเลือดไหลก่อนตามหาสาเหตุ ปิดเส้นทางเสี่ยง (feature toggle แบนเนอร์ชั่วคราว หยุดคิว) และทดสอบการใช้งานสำคัญหนึ่งเส้นทาง ทำเส้นทางที่สำคัญต่อธุรกิจ ไม่ใช่ที่ง่ายที่สุด
-
กู้คืนบริการ (10-20 นาที): เลือกการกระทำที่ปลอดภัยที่สุด: ย้อนกลับไปเวอร์ชันที่รู้ว่าดีล่าสุดหรือใช้การแก้เล็ก ๆ บนที่เป็นไปได้ ในแพลตฟอร์มเช่น AppMaster อาจหมายถึง redeploy build ก่อนหน้าหรือย้อนคืนการเปลี่ยนล่าสุด แล้วยืนยันว่าอัตราข้อผิดพลาดและเวลาตอบกลับกลับสู่ปกติ
-
สื่อสาร (ตลอดเวลา): โพสต์สถานะสั้น ๆ ว่ามีอะไรได้รับผลกระทบ ผู้ใช้ควรทำอย่างไร และเวลาอัปเดตต่อไป ให้สคริปต์สองประโยคกับซัพพอร์ตเพื่อให้ทุกคนพูดเหมือนกัน
-
ปิดเหตุอย่างเรียบร้อย (ก่อนที่คุณจะลืม): จดสิ่งที่เกิดขึ้น การเปลี่ยนแปลงที่ทำ และเวลาเมื่อบริการกู้คืน มอบหมายงานติดตามพร้อมเจ้าของและวันครบกำหนด (ปรับมอนิเตอร์ แก้ช่องว่างการทดสอบ ทำความสะอาดข้อมูล แก้ถาวร)
หลังเหตุการณ์: เรียนรู้ แก้ไข และป้องกันไม่ให้เกิดซ้ำ
เหตุการณ์จะไม่ถือว่า “เสร็จ” เมื่อแอพกลับมาเร็วที่สุด วิธีที่เร็วที่สุดในการลดเวลาหยุดบริการในอนาคตคือจับสิ่งที่เกิดขึ้นขณะความทรงจำยังสด แล้วแปลงบทเรียนนั้นเป็นการเปลี่ยนแปลงเล็ก ๆ และเป็นรูปธรรม
กำหนดทบทวนสั้นภายใน 2-5 วัน รักษาโทนไร้การตัดสินและเป็นประโยชน์ เป้าหมายไม่ใช่หาคนผิด แต่ทำให้การจัดการเหตุการณ์ครั้งต่อไปง่ายขึ้น
เขียนบันทึกที่ใครสักคนอ่านได้ในอีกหลายเดือนต่อมา: ผู้ใช้เห็นอะไร เมื่อใดที่คุณตรวจพบ อะไรลองแล้ว อะไรได้ผล และเมื่อบริการกลับมา โดยรวมรากเหตุหากรู้ และจดปัจจัยที่ช่วยให้เกิดเหตุซ้ำ เช่น ขาดการแจ้งเตือน เจ้าของไม่ชัด หรือขั้นตอนปล่อยสับสน
แปลงบทเรียนเป็นงานที่มีเจ้าของและวันครบกำหนด โฟกัสที่การเปลี่ยนแปลงเล็ก ๆ ที่ป้องกันความล้มเหลวซ้ำ:
- ปิดช่องว่างการมอนิเตอร์ (เพิ่มการแจ้งเตือนหรือเช็กบอร์ดที่จับมันได้เร็วขึ้น)
- เพิ่ม guardrail (กฎการ validate, rate limit, ค่า default ของ feature flag, ขั้นตอนอนุมัติ)
- ปรับปรุงการทดสอบสำหรับพื้นที่เสี่ยง (ล็อกอิน การชำระเงิน การนำเข้าข้อมูล สิทธิ์)
- อัปเดต runbook ด้วยขั้นตอนที่คุณอยากมี
- ทำการฝึกอบรมสั้นให้ผู้รับผิดชอบบนคอลหรือเจ้าของแอพ
เลือกมาตรการป้องกันอย่างน้อยหนึ่งอย่างต่อเหตุการณ์ แม้จะเล็ก เช่น “การเปลี่ยนบทบาทต้องมีผู้ตรวจสอบคนที่สอง” หรือ “การย้ายข้อมูลต้องรันบนสำเนา staging ก่อน” สามารถป้องกันการหยุดซ้ำได้
เก็บ runbook นี้ไว้ใกล้กับกระบวนการ build และ release ของคุณ ถ้าคุณสร้างด้วย AppMaster ให้จดว่าทุกแอพ deploy ที่ไหน (AppMaster Cloud, AWS, Azure, Google Cloud, หรือ self-hosted) ใคร redeploy ได้เร็ว และใครย้อนกลับได้ หากต้องการที่เก็บเอกสารรวมหนึ่งที่หาได้ ให้เก็บไว้ข้างบันทึกโปรเจกต์ AppMaster ของคุณ (appmaster.io) เพื่อให้ง่ายค้นหาเมื่อเวลานาทีมีค่า
คำถามที่พบบ่อย
ใช้เมื่อต่อเมื่อปัญหาไม่คาดคิดกีดขวางงานหลัก ทำให้แอพช้ามาก หรือเสี่ยงต่อการเปลี่ยนแปลงข้อมูลที่ไม่ถูกต้องหรือไม่ปลอดภัย หากผู้ใช้ล็อกอินไม่ได้ การชำระเงินล้มเหลว ออโตเมชันหยุดทำงาน หรือมีการเขียนข้อมูลผิด ให้ถือเป็นเหตุการณ์และปฏิบัติตาม runbook นี้
เริ่มจากผลกระทบต่อผู้ใช้: ตอนนี้ใครทำอะไรไม่ได้บ้าง และเกิดขึ้นตั้งแต่เมื่อไร จากนั้นทำซ้ำปัญหาโดยใช้บทบาทและอุปกรณ์เดียวกับผู้ใช้ที่ได้รับผลกระทบ ตรวจสอบว่าเป็นปัญหาเฉพาะบัญชี ช่วงลูกค้าบางกลุ่ม หรือทุกคน เพื่อไม่ให้ตามหาสาเหตุผิดจุด
ประกาศเป็น SEV1 เมื่อผู้ใช้ส่วนใหญ่ถูกบล็อกหรือเงิน/ความปลอดภัย/ข้อมูลตกอยู่ในความเสี่ยง ใช้ SEV2 เมื่อฟีเจอร์สำคัญเสียแต่มีวิธีแก้ชั่วคราว และ SEV3 สำหรับปัญหาเล็กหรือขอบเขตจำกัด; การตัดสินอย่างรวดเร็วสำคัญกว่าถูกต้องสมบูรณ์
ตั้งหัวหน้าเหตุคนเดียวที่ตัดสินใจสุดท้าย แล้วมอบหมาย fixer, ผู้ดูแลการสื่อสาร และคนจดบันทึก เพื่อหลีกเลี่ยงการทับซ้อนหรือการแก้ไขโดยไม่ตั้งใจ ในทีมเล็กหนึ่งคนอาจรับสองบทบาทได้ แต่บทบาท incident lead ควรกำหนดชัดเจน
การควบคุมความเสียหายคือการหยุดความเสียหายอย่างรวดเร็ว แม้สาเหตุยังไม่ชัด ใน AppMaster มักหมายถึงการปิด Business Process บางตัว ชั่วคราวซ่อน action บน UI ที่ก่อปัญหา หรือหยุดออโตเมชันที่ลูปหรือเขียนข้อมูลผิด
ย้อนกลับเมื่อปัญหาเริ่มทันทีหลังการปล่อยและคุณมีเวอร์ชันที่รู้ว่าปลอดภัยซึ่งคืนบริการได้เร็ว เลือกแก้หน้าไปข้างหน้าเมื่อคุณแก้ไขเล็ก ๆ ที่เสี่ยงต่ำและยืนยันผลได้เร็วโดยไม่เสี่ยงต่อเวลาหยุดทำงานเพิ่ม
การย้อนกลับจะเสี่ยงเมื่อสคีมาฐานข้อมูลเปลี่ยน แก้ไขบางอย่างไม่สามารถย้อนกลับได้ หรืองานคิวและ webhook อาจถูกประมวลผลซ้ำโดยลอจิกเก่า หากเป็นเช่นนั้น ให้นิ่งก่อนและยืนยันว่ารุ่นเก่าคาดหวังสภาพฐานข้อมูลอย่างไรก่อน redeploy
หยุดการเขียนก่อนเมื่อสงสัยว่าข้อมูลถูกทำลาย เพราะการเขียนข้อมูลผิดจะเพิ่มงานทำความสะอาด แปลงเป็นการปิดฟอร์ม ชะการออโตเมชันอัพเดต หรือล็อก endpoint การอัพเดต จนกว่าจะแน่ใจว่ารายการใหม่ไม่ถูกเปลี่ยนผิดไป
ส่งอัปเดตสั้น ๆ และตรงไปตรงมาตามรอบเวลาที่กำหนด บอกว่ามีอะไรได้รับผลกระทบ คุณกำลังทำอะไร และจะอัปเดตครั้งต่อไปเมื่อไร หลีกเลี่ยงการเดาสาเหตุหรือโทษผู้ให้บริการ ฝ่ายต่าง ๆ ต้องการความชัดเจนและการอัปเดตรายรอบ
เรียกว่าจัดการเสร็จ (resolved) เมื่ออาการหลักหายไปและการตรวจสอบสำคัญคลีน เช่น การล็อกอิน งานหลัก และอัตราข้อผิดพลาด หากคุณแก้แล้วแต่ยังต้องเฝ้าดูให้เรียกว่า monitoring ระบุว่าจะเฝ้าดูอะไร และนานเท่าไร


