“โปรดักชั่นลุกเป็นไฟ” เป็นคำอธิบายอย่างไม่เป็นทางการของข้อขัดข้องร้ายแรงที่ทำให้แอปพลิเคชันมือถือไม่สามารถเข้าถึงได้บางส่วนหรือทั้งหมดสำหรับผู้ใช้ สาเหตุทั่วไปรวมถึงกรณีขอบที่ไม่ได้คาดคิดในรุ่นใหม่ การหยุดทำงานของผู้ให้บริการคลาวด์ ข้อผิดพลาดในการย้ายฐานข้อมูล หรือการโจมตี DDoS ตาม Google SRE Book 80% ของเหตุการณ์ร้ายแรงเกิดจากการเปลี่ยนแปลงที่ทำขึ้นภายใน 48 ชั่วโมงที่ผ่านมา วิศวกร on-call ต้องดำเนินการตาม runbook ที่ชัดเจน: หยุดเลือดก่อน จากนั้นวินิจฉัยสาเหตุ
ประเด็นสำคัญ
วลี “โปรดักชั่นลุกเป็นไฟ” (ทุกอย่างล่ม) อธิบายสถานการณ์ที่สภาพแวดล้อมโปรดักชั่นทำงานไม่ถูกต้องและผู้ใช้ได้รับผลกระทบ ข้อขัดข้องอาจแสดงเป็นการไม่สามารถเข้าถึงแอปพลิเคชันทั้งหมด (หน้าจอว่าง ข้อผิดพลาด 502) การไม่สามารถเข้าถึงบางส่วน (โมดูลการชำระเงินไม่ทำงานแต่ฟังก์ชันอื่นใช้งานได้) หรือประสิทธิภาพลดลง (โหลดช้ามาก) ระดับความรุนแรงของเหตุการณ์ กำหนดโดยเปอร์เซ็นต์ของผู้ใช้ที่ได้รับผลกระทบและระยะเวลาของการหยุดชะงัก
ตาม Atlassian Statuspage (2025) เวลาหยุดทำงานเฉลี่ยสำหรับแอปพลิเคชันมือถือในปี 2024 อยู่ที่ 27 นาทีต่อเหตุการณ์ สาเหตุที่พบบ่อยที่สุด: การถดถอยของโค้ดหลังการปรับใช้ (34%) การหยุดทำงานของผู้ให้บริการคลาวด์ (22%) ปัญหาฐานข้อมูล (18%) ข้อผิดพลาดการกำหนดค่า (15%) และการโจมตี DDoS (11%) ข้อสรุปสำคัญ: ข้อขัดข้องส่วนใหญ่เกิดจากการเปลี่ยนแปลงที่ทีมทำขึ้นเอง ไม่ใช่จากปัจจัยภายนอก
สิ่งสำคัญคือต้องแยกความแตกต่างระหว่าง crash (แอปพลิเคชันล่มฝั่งไคลเอ็นต์) และ backend outage (เซิร์ฟเวอร์ไม่พร้อมใช้งาน) Crash มักจะแก้ไขด้วย hotfix ของโค้ดไคลเอ็นต์ ในขณะที่ backend outage ต้องการการเปลี่ยนแปลงโครงสร้างพื้นฐานหรือการปรับใช้บริการซ้ำ เมตริกการตรวจสอบ: สำหรับไคลเอ็นต์ — อัตราปราศจาก crash, สำหรับเซิร์ฟเวอร์ — อัตราข้อผิดพลาด 5xx และความหน่วง p95 APM (การตรวจสอบประสิทธิภาพแอปพลิเคชัน) — Sentry, New Relic, Datadog — ช่วยระบุประเภทของข้อขัดข้องได้อย่างรวดเร็ว
การจำแนกระดับความรุนแรงที่เป็นหนึ่งเดียวคือพื้นฐานของการตอบสนองที่รวดเร็ว หากไม่มี ทีมจะเสียเวลา discussing “เรื่องนี้เร่งด่วนแค่ไหน” แทนที่จะลงมือทำ ระดับมาตรฐาน: P0 (ร้ายแรง) — แอปพลิเคชันไม่สามารถเข้าถึงได้ทั้งหมดหรือข้อมูลผู้ใช้รั่วไหล เวลาตอบสนอง — ทันที; P1 (สูง) — ฟังก์ชันสำคัญไม่ทำงานสำหรับผู้ใช้ 50%+ เวลาตอบสนอง — 15 นาที; P2 (ปานกลาง) — ฟังก์ชันที่ไม่สำคัญไม่พร้อมใช้งานสำหรับผู้ใช้บางส่วน เวลาตอบสนอง — 1 ชั่วโมง
P0 ต้องการการยกระดับทันที: วิศวกร on-call หยุดงานปัจจุบันทั้งหมดและมุ่งเน้นไปที่เหตุการณ์ หากปัญหาไม่ได้รับการแก้ไขภายใน 10 นาที — หัวหน้าทีมเทคนิคเข้าร่วม หากหลังจาก 30 นาที — ยกระดับไปยังผู้จัดการฝ่ายวิศวกรรม สำหรับเหตุการณ์ P0 อนุญาตให้ละเมิดกระบวนการใดๆ: ทำ hotfix โดยไม่ต้องตรวจสอบโค้ดอย่างสมบูรณ์ ปรับใช้กับโปรดักชั่นโดยตรง ไม่สนใจกฎการป้องกันสาขา การแทนที่ฉุกเฉิน ต้องตกลงกันล่วงหน้าในระดับทีม
| ระดับ | คำอธิบาย | ตัวอย่าง | เวลาตอบสนอง |
|---|---|---|---|
| P0 | แอปพลิเคชันไม่สามารถเข้าถึงได้ทั้งหมดหรือข้อมูลรั่วไหล | หน้าจอว่างเมื่อเริ่มต้น, SQL injection | ทันที |
| P1 | ฟังก์ชันสำคัญไม่ทำงานสำหรับ 50%+ | การชำระเงินไม่ทำงาน, การเข้าสู่ระบบเสีย | 15 นาที |
| P2 | ฟังก์ชันที่ไม่สำคัญไม่พร้อมใช้งาน | อวาตาร์ไม่โหลด, การค้นหาช้า | 1 ชั่วโมง |
| P3 | บั๊กด้านความสวยงามโดยไม่กระทบผู้ใช้ | ปัญหาเลย์เอาต์, พิมพ์ผิดในข้อความ | รุ่นถัดไป |
สิ่งสำคัญอย่างยิ่งคือไม่ประเมินระดับความรุนแรงต่ำเกินไป เหตุการณ์ P0 และ P1 ที่จำแนกเป็น P2 นำไปสู่การตอบสนองที่ล่าช้าและเพิ่มเวลาหยุดทำงาน กฎ: หากสงสัย — ตั้งเป็น P0 การจำแนกเกิน ดีกว่าการจำแนกขาด: จัดประชุมเพิ่มดีกว่าเสียเวลากู้คืนหนึ่งชั่วโมง
ตัวจับเวลาเริ่ม: จาก moments ที่ได้รับการแจ้งเตือนหรือข้อความจากผู้ใช้ 10 นาทีแรกสำคัญที่สุด ขั้นตอน: 1) ยืนยันปัญหา — ตรวจสอบว่าปัญหาจริง (ไม่ใช่สัญญาณเตือนเท็จ); 2) หยุดเลือด — ลดผลกระทบทันที (rollback, feature toggle, ปิดกั้น endpoint); 3) สื่อสาร — เขียนในช่อง #incident ทั่วไปสถานะ: เกิดอะไรขึ้น, ระดับความรุนแรง, กำลังทำอะไร 10 นาทีแรก ไม่ใช้ไปกับการวิเคราะห์สาเหตุที่แท้จริง
ควบคู่ไปกับการหยุดเลือด วิศวกรหนึ่งคนเริ่มการวินิจฉัยในขณะที่อีกคนจัดการการสื่อสาร ช่องทางการสื่อสาร: ช่อง Slack #incident (สำหรับทีม), หน้าสถานะ (สำหรับผู้ใช้), อีเมล/SMS การยกระดับ (สำหรับผู้จัดการ) ทุก 15 นาที — อัปเดตสถานะพร้อมข้อมูล: รู้了什么, กำลังทำอะไร, เวลากู้คืนโดยประมาณ หน้าสถานะ (StatusPage, Statuspal) แสดงเวลาทำงานและประวัติเหตุการณ์สำหรับผู้ใช้ภายนอก
กฎข้อแรกและสำคัญที่สุด: อย่าพยายามแก้ไขปัญหาในโปรดักชั่น หากรุ่นใหม่ทำให้เกิดข้อขัดข้อง — rollback กลับไปยังรุ่นเสถียรก่อนหน้า หากข้อขัดข้องเกิดจากฟีเจอร์เฉพาะที่อยู่เบื้องหลัง feature toggle — เพียงปิด toggle หากไม่มีทั้ง rollback และ toggle — ใช้ hotfix ที่มีการเปลี่ยนแปลงน้อยที่สุด Rollback เป็นตัวเลือกที่ปลอดภัยที่สุดเพราะกลับไปยังสถานะที่ทำงานได้อยู่แล้ว
Feature toggle (หรือ feature flag) เป็นเครื่องมือทรงพลังในการหยุดเลือดโดยไม่ต้องปรับใช้ หากโมดูลการชำระเงินล่มแต่ถูกปิดผ่าน toggle — ผู้ใช้จะไม่เห็นปุ่มชำระเงินแทนที่จะได้รับหน้าจอข้อผิดพลาด Toggle ไม่ต้องการบิลด์ ไม่ต้องการการตรวจสอบจากร้านค้า และมีผลในไม่กี่วินาที ทุกฟีเจอร์สำคัญควรอยู่เบื้องหลัง feature toggle ที่สามารถปิดได้ในระดับเซิร์ฟเวอร์ (การกำหนดค่าระยะไกล) Feature flag — แนวป้องกันแรก
หาก rollback เป็นไปไม่ได้ (เช่น เนื่องจากการย้ายฐานข้อมูลที่ไม่สามารถย้อนกลับได้) และไม่มี toggle — ทางเลือกสุดท้าย: hotfix ด้วยการเปลี่ยนแปลงน้อยที่สุด Hotfix สร้างจากแท็กรุ่นล่าสุด ประกอบด้วยเฉพาะบรรทัดที่จำเป็นเพื่อแก้ไขข้อขัดข้อง และผ่านการปรับใช้แบบด่วน (ดูบทความ “Hotfix — การแก้ไขด่วน”) กฎทอง: หลังจากคงเสถียรภาพ ให้วิเคราะห์สาเหตุที่แท้จริงเสมอ แม้ว่าสาเหตุจะดูชัดเจน
หลังจากหยุดเลือด (หรือควบคู่กัน ถ้าจำนวนวิศวกรเอื้ออำนวย) เริ่มการวินิจฉัย แหล่งแรกคือล็อก การบันทึกแบบรวมศูนย์ (ELK, Grafana Loki, Datadog Logs) ช่วยให้ค้นหาข้อผิดพลาดตาม timestamp, ID ผู้ใช้ หรือ ID คำขอ สำคัญ: ล็อกต้องมีโครงสร้าง (JSON) เพื่อให้ grep ทำงานได้เร็ว การบันทึกแบบมีโครงสร้าง เป็นข้อกำหนดบังคับสำหรับบริการทั้งหมด
แหล่งที่สองคือเมตริก Grafana, Datadog, New Relic แสดงว่าจุดสูงสุดของข้อผิดพลาดเกิดขึ้นเมื่อใด ที่ endpoint ใด และด้วยรหัสสถานะใด การเปรียบเทียบเมตริกก่อนและหลังการปรับใช้ช่วยระบุปัญหาที่บริการหรือ endpoint เฉพาะ เมตริก RED (Rate, Errors, Duration) — มาตรฐานการตรวจสอบไมโครเซอร์วิส
แหล่งที่สามคือการติดตามแบบกระจาย (distributed tracing) Jaeger, Zipkin, Datadog APM แสดงเส้นทางของคำขอผ่านไมโครเซอร์วิสและระบุว่าความหน่วงหรือข้อผิดพลาดเกิดขึ้นที่ใด การติดตามมีประโยชน์โดยเฉพาะในข้อขัดข้องแบบลูกโซ่ เมื่อข้อขัดข้องในบริการหนึ่งทำให้เกิดข้อผิดพลาดในบริการที่พึ่งพาทั้งหมด Trace ID ต้องถูกส่งจากไคลเอ็นต์ไปยังบริการ backend ทั้งหมด
# ตัวอย่างการวินิจฉัยด่วนโดยใช้ kubectl และล็อก
# แสดงรายการ pod ที่มีข้อผิดพลาด
kubectl get pods --field-selector=status.phase!=Running
# ตรวจสอบล็อกของ pod ที่ crash
kubectl logs --previous pod/auth-service-7f4b9c5d6-abc12
# ค้นหาข้อผิดพลาดในบริการ 30 นาทีที่ผ่านมา
kubectl logs deployment/api-gateway --since=30m
| grep "5[0-9][0-9]" | head -50
สำคัญ: อย่าพยายามวินิจฉัยสาเหตุก่อนหยุดเลือด หาก 50% ของผู้ใช้เห็น crash — rollback ก่อน แล้วค่อยสอบสวน ข้อยกเว้น: หาก rollback ใช้เวลานานกว่า hotfix โดยตรง (เช่น เนื่องจากข้อมูลไม่เข้ากัน) ในกรณีนี้ ให้ใช้ hotfix ทันทีและดำเนินการ post-mortem หลังจากคงเสถียรภาพ การวินิจฉัยก่อนแก้ไข เป็นรูปแบบที่อันตรายซึ่งเพิ่มเวลาหยุดทำงาน
Post-mortem (หรือเรียกอีกอย่างว่าการทบทวนเหตุการณ์) คือการวิเคราะห์เหตุการณ์อย่างมีโครงสร้างที่ดำเนินการ 24–72 ชั่วโมงหลังจากการแก้ไข วัตถุประสงค์: ทำความเข้าใจว่าทำไมข้อขัดข้องจึงเกิดขึ้น ทำไมการตรวจสอบและการทดสอบไม่ตรวจพบก่อนโปรดักชั่น และจะเปลี่ยนแปลงอะไรในกระบวนการเพื่อป้องกันการเกิดซ้ำ วัฒนธรรมไม่กล่าวโทษ เป็นหลักการพื้นฐาน: post-mortem อภิปรายกระบวนการ เครื่องมือ และการสื่อสาร ไม่ใช่ความผิดพลาดของบุคคลเฉพาะ
โครงสร้างเอกสาร post-mortem: ไทม์ไลน์ (ลำดับเหตุการณ์พร้อม timestamp), ผลกระทบ (ผู้ใช้ที่ได้รับผลกระทบ ระยะเวลา ความเสียหายทางการเงิน), สาเหตุที่แท้จริง (สาเหตุทางเทคนิคหลัก), การตรวจพบ (ค้นพบได้อย่างไร ทำไมไม่ตรวจพบก่อนหน้านี้), การตอบสนอง (ทำอะไรไปแล้ว, อะไรที่ทำได้เร็วกว่านี้), รายการดำเนินการ (งานเฉพาะพร้อมผู้รับผิดชอบและกำหนดเวลา) รายการดำเนินการ ต้องเป็น S.M.A.R.T.: เฉพาะเจาะจง, วัดผลได้, มอบหมายได้, เป็นจริง, มีกรอบเวลา
รายการดำเนินการทั่วไปหลังจากข้อขัดข้องในโปรดักชั่น: เพิ่มการตรวจสอบและการแจ้งเตือนสำหรับเมตริกที่เงียบ; ขยายขอบเขตการทดสอบสำหรับกรณีที่พลาด; เพิ่มหน้าใน runbook พร้อมขั้นตอนทีละขั้นตอนสำหรับสถานการณ์ที่คล้ายคลึงกัน; จัดการฝึกอบรมทีมเกี่ยวกับเครื่องมือที่ใช้ไม่ถูกต้อง ทุกรายการดำเนินการคือการเปลี่ยนแปลงที่เป็นรูปธรรมซึ่งลดโอกาสเกิดเหตุการณ์ซ้ำ
คำถามที่พบบ่อย
หากการย้ายฐานข้อมูลไม่สามารถย้อนกลับได้ (drop column, rename table) การ rollback ด้วยโค้ดจะไม่ช่วย ในกรณีนี้ — ใช้ feature toggle สำหรับฟีเจอร์ใหม่ จากนั้นใช้ hotfix บนสคีมาใหม่ การย้ายฐานข้อมูล ควรย้อนกลับได้: แต่ละการย้าย forward + backward
P0 — แอปพลิเคชันไม่สามารถเข้าถึงได้หรือข้อมูลรั่วไหล P1 — แอปพลิเคชันทำงาน แต่ฟังก์ชันสำคัญ (การชำระเงิน การเข้าสู่ระบบ การโหลดเนื้อหา) ไม่ทำงานสำหรับผู้ใช้ส่วนใหญ่ ทดสอบ: หากผู้ใช้ไม่สามารถเปิดแอปได้ — นั่นคือ P0 หากเปิดได้แต่บางอย่างไม่ทำงาน — นั่นคือ P1
ใช่ สำหรับทุกเหตุการณ์ P0/P1 จะสร้างช่อง Slack เฉพาะ #incident-YYYY-MM-DD-description สิ่งนี้แยกการสนทนาออกจากช่องทั่วไปและเก็บประวัติสำหรับ post-mortem ช่องเหตุการณ์ จะถูกเก็บถาวรอัตโนมัติ 7 วันหลังจากปิดเหตุการณ์
Post-mortem บังคับสำหรับเหตุการณ์ P0 ทั้งหมด สำหรับ P1 — ตามดุลยพินิจของหัวหน้าทีมเทคนิค หากเหตุการณ์สั้น (น้อยกว่า 5 นาที) และสาเหตุเล็กน้อย สำหรับ P2 และต่ำกว่า — ไม่จำเป็นต้อง post-mortem บันทึกใน ticket ก็เพียงพอ ทุก P0 จะถูกทบทวน แม้ว่าสาเหตุจะ已知แล้ว — การฝึกฝนกระบวนการมีค่ามากกว่าการทบทวนเอง
วิศวกร on-call (ผู้ตอบสนอง), หัวหน้าทีมเทคนิค, ผู้จัดการผลิตภัณฑ์ (สำหรับการประเมินผลกระทบ), วิศวกรที่ทำงานบนระบบที่เกี่ยวข้อง ผู้อำนวยความสะดวก — บุคคลแยกต่างหากที่ไม่ได้เกี่ยวข้องกับเหตุการณ์ — ดำเนินการประชุมและรับรองน้ำเสียงที่ไม่กล่าวโทษ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม