Vòng đời dự án Nâng cao 6 phút đọc

Ứng phó sự cố: severity, comms, rollback

Cách chạy sự cố từ page đến all-clear: mức severity, vai trò incident commander, nhịp comms trong sự cố, và cây quyết định rollback.

Mục lục
  1. Khi nào quy trình sự cố thật sự mang lại giá trị?
  2. Cái giá khi quy trình sự cố yếu là gì?
  3. Hình dạng ứng phó sự cố trông thế nào?
  4. Template runbook sự cố cụ thể là gì?
  5. Ứng phó sự cố scale lên đa team ra sao?
  6. Quy trình có thể tự tạo ra những lỗi nào?
  7. Khi nào quy trình sự cố chính thức là quá liều?
  8. Đi tiếp từ đây như thế nào?

Lần đầu bạn bị page lúc 3 giờ sáng vì một sự cố production, ranh giới giữa một outage 30 phút và một outage 3 giờ thường nằm ở runbook. Không phải ở sự anh hùng của engineer, cũng không phải ở kinh nghiệm của team - mà ở chính cái tài liệu nói rõ phải check cái gì, gọi ai, và khi nào nên roll back. Chương này giới thiệu hình dạng của runbook và quy trình sự cố sử dụng nó.

Khi nào quy trình sự cố thật sự mang lại giá trị?

Có ba tín hiệu.

Production có user bên ngoài. Một tool nội bộ có thể tha thứ cho một outage kéo dài cả giờ; nhưng một service hướng khách hàng thì không.

On-call có nhiều hơn một người tham gia. Khi chỉ có một người vận hành duy nhất, họ có thể giữ ngữ cảnh trong đầu. Nhưng vừa đến lúc hai người chia rotation, một runbook viết ra bắt đầu trở thành thiết yếu.

Có cam kết SLA / SLO. Dù là cam kết hợp đồng hay nội bộ, việc vi phạm đều có chi phí đo được. Quy trình tồn tại để cho việc vi phạm hiếm xảy ra.

Nếu hệ chỉ phục vụ nội bộ, được dùng nhẹ, và bạn có thể fix ở tốc độ con người, thì một quy trình sự cố chính thức chỉ là gánh nặng.

Cái giá khi quy trình sự cố yếu là gì?

Có ba kiểu lỗi thường gặp.

Phục hồi kiểu anh hùng, không có học hỏi. Một engineer senior fix sự cố lúc 4 giờ sáng, sau đó không có post-mortem. Sáu tuần sau cùng sự cố ấy lại xảy ra, vì chẳng có gì thay đổi.

Mất tiếng comms. Engineer fix; chẳng ai cập nhật cho khách hàng. Khách rời đi trong sự im lặng đó.

Do dự khi rollback. "Sắp xong rồi" - và 30 phút biến thành 2 giờ. Trong khi đáng lẽ rollback chỉ tốn 5 phút.

Hình dạng ứng phó sự cố trông thế nào?

flowchart TB
    Page[Page nổ] --> Tri[Triage<br/>0-5 phút]
    Tri --> Sev{Severity?}
    Sev -->|P1| P1[Production down<br/>cả team page<br/>comms 30 phút]
    Sev -->|P2| P2[Xuống cấp<br/>on-call + lead<br/>comms giờ]
    Sev -->|P3| P3[Mỹ phẩm<br/>ticket backlog]
    P1 --> Decide{Fix trong 30 phút?}
    P2 --> Decide
    Decide -->|Có| Fix[Fix forward]
    Decide -->|Không| Roll[Roll back]
    Fix --> AllClear[Verify metric<br/>all clear]
    Roll --> AllClear
    AllClear --> Post[Post-mortem<br/>trong 48h]

P1 nghĩa là production down hoặc xuống cấp nghiêm trọng đối với khách hàng; P2 nghĩa là xuống cấp nhưng vẫn còn chạy được; P3 là sự cố nhỏ. Mức severity sẽ quyết định ai bị page, nhịp comms ra sao, và mức độ quyết liệt khi rollback.

Template runbook sự cố cụ thể là gì?

# Runbook Sự Cố — {{ Tên Service }}

## Định nghĩa severity
- **P1**: Service down HOẶC error rate > 5% HOẶC latency p99 > 5x
  baseline. Page mọi người. Cập nhật khách mỗi 30 phút.
- **P2**: Xuống cấp - error rate 0.5-5% HOẶC latency p99 2-5x
  baseline. Page on-call + lead. Cập nhật giờ.
- **P3**: Mỹ phẩm, một user, hay không chặn. Ticket; phản hồi
  trong 4 giờ giờ làm việc.

## Phản ứng on-call (5 phút đầu)
1. Acknowledge page
2. Mở channel sự cố: #incident-{{ timestamp }}
3. Mở dashboard: {{ link Grafana }}
4. Xác định severity từ định nghĩa trên
5. Nếu P1, page backup incident commander; kích comms lead

## Vai trò trong sự cố
- **Incident commander** (IC): chạy channel, ra quyết định
- **Comms lead**: viết cập nhật khách + stakeholder
- **Engineer**: điều tra và fix
- IC và comms lead KHÔNG phải cùng người

## Cây quyết định (check theo thứ tự)

- Deploy gần đây trong 6 giờ? -> Roll back deploy trước (5 phút)
- Query database chậm? -> Check pg_stat_activity; kill query dài
- Dependency ngoài lỗi? -> Check status page; kích fallback
- Cache stampede? -> Pre-warm key hot; xem chương cache

## Template báo stakeholder

**P1 hướng khách**: Chúng tôi nhận biết vấn đề ảnh hưởng
{{ tính năng }}. Team đang điều tra. Sẽ cập nhật trước
{{ thời gian + 30 phút }}.

**P1 nội bộ**: [P1] {{ Service }} - {{ dấu hiệu }} - IC:
{{ tên }} - Channel: #incident-{{ id }}

## Checklist sau all-clear

- Báo khách: đã giải quyết
- Channel sự cố: tóm tắt đăng
- Doc post-mortem tạo (link template)
- Slot lịch đặt review không đổ lỗi (trong 48h)

Phần hữu dụng nhất chính là cây quyết định. Vào lúc 3 giờ sáng, engineer on-call không nên phải tự bịa ra cách ứng phó

Ứng phó sự cố scale lên đa team ra sao?

flowchart TB
    Page[Page nổ] --> OnCall[On-call service<br/>P1 trong 5 phút]
    OnCall --> Multi{Chạm nhiều<br/>service?}
    Multi -->|Có| WarRoom[Mở war room<br/>page IC + comms]
    Multi -->|Không| Single[Một team xử]
    WarRoom --> Other1[On-call service khác<br/>vào channel]
    WarRoom --> Other2[Customer support<br/>vào channel]
    WarRoom --> Other3[Comms lead<br/>viết cập nhật khách]

War room là pattern dùng cho sự cố đa team: một channel Slack duy nhất, IC có thực quyền xuyên team, và on-call của mỗi team đều vào. Comms lead viết một bản cập nhật chung gửi tới mọi đối tượng (xem plan stakeholder để biết danh sách).

Quy trình có thể tự tạo ra những lỗi nào?

Khi nào quy trình sự cố chính thức là quá liều?

Có hai trường hợp.

Service do một engineer sở hữu. Một người sở hữu hệ, bị page, tự fix, rồi viết một tin nhắn Slack ngắn về chuyện đã xảy ra. Thêm runbook 5 trang vào tình huống này chỉ là gánh nặng.

Beta nội bộ. Một tính năng đứng sau flag chỉ-nội-bộ bị vỡ không phải là sự cố khách hàng. Cứ triage trong giờ làm việc.

Quy trình đầy đủ chỉ scale tương ứng với mức tác động tới khách hàng và quy mô team. Dưới ngưỡng đó, nhịp nhẹ vẫn chạy được.

Đi tiếp từ đây như thế nào?

Chương tiếp theo: retrospective và post-mortem

Câu hỏi thường gặp

Khi nào nên roll back, khi nào fix forward?
Mặc định cứ roll back trước. Nếu sự cố là kết quả của một thay đổi gần đây và rollback có thể xong trong dưới 30 phút, hãy làm ngay rồi phân tích sau. Chỉ fix forward khi rollback bất khả thi (data đã migrate, API third-party đã commit) hoặc khi việc fix thật sự nhanh hơn rollback. Phần lớn team đánh giá thấp tốc độ rollback và đánh giá quá cao tốc độ fix dưới áp lực.
Ai sẽ là incident commander?
Là người đang on-call khi page nổ, kèm việc handoff nếu sự cố vượt chuyên môn của họ. Incident commander không phải là engineer senior nhất theo mặc định - đó là người ra quyết định. Việc của họ là quyết, không phải tự fix. Chương observability ở System Design nói về các metric dẫn dắt quyết định trong sự cố.
Trong lúc sự cố, cập nhật bao thường xuyên?
Với P1 (production down): mỗi 30 phút, kể cả khi nội dung cập nhật là 'vẫn đang điều tra, không có tiến triển mới'. Im lặng còn tệ hơn tin xấu. Với P2 (xuống cấp): mỗi giờ. Team customer support sẽ forward bản cập nhật của bạn cho khách hàng; nếu không có nó, họ sẽ tự bịa. Chương stakeholder nói về các channel comms cần dùng.
Post-mortem 'không đổ lỗi' nghĩa là gì?
Post-mortem gọi tên cái gì đã xảy ra và vì sao, nhưng không đổ tội cho ai. Khung tư duy là: 'Chuyện này có thể xảy ra với bất cứ ai có cùng công cụ và quy trình như chúng ta; vậy làm sao công cụ và quy trình bắt được nó ở lần kế tiếp?'. Không đổ lỗi không có nghĩa là không có trách nhiệm; nó chỉ chuyển trách nhiệm về phía hệ thống thay vì cá nhân.