Interviewer expect bạn biết quy trình cơ bản: xác nhận sự cố, alert team, rollback nếu có deploy gần đây, theo dõi logs. Không cần dẫn dắt — cần thực hiện được khi được giao việc.
Điểm cộng: biết dùng kubectl, đọc được Prometheus metrics, không panic.
Mitigate trước, root cause sau. Đừng cố hiểu hết rồi mới hành động — bleeding phải dừng trước.
Một người chỉ huy, không ai "freelance". Khi nhiều engineer tự ý thay đổi production song song, outage kéo dài gấp đôi. (Google SRE gọi đây là "freelancing".)
Im lặng là sai lầm lớn nhất. Alert team ngay từ phút đầu, dù chưa biết gì.
Khi interviewer hỏi câu này, đừng vội liệt kê các bước — hãy mở đầu bằng mindset, rồi mới đi vào action. Nghe tự nhiên hơn và cho thấy bạn đã từng xử lý thật sự:
"Việc đầu tiên tôi làm không phải là mở terminal — mà là xác nhận sự cố có thật không, vì false alarm lúc 2h sáng thì tốn công hơn là nó đáng. Tôi check error rate trên Grafana và pod status trên kubectl trong vòng 1-2 phút. Nếu confirm down, tôi lập tức tạo incident channel trên Teams, tag on-call và assign một người làm Incident Commander — người này chỉ coordinate, không tự tay sửa gì. Tôi sẽ nhìn vào kubectl describe để biết pod chết vì lý do gì: OOMKilled, CrashLoopBackOff hay connection timeout — mỗi cái có cách xử lý khác nhau. Nếu vừa có deployment trong vài giờ qua, rollback là hành động đầu tiên tôi làm mà không cần suy nghĩ nhiều. Trong khi chờ rollback, tôi update team mỗi 10-15 phút dù chưa có kết quả — im lặng trong incident còn tệ hơn là nói 'tôi chưa biết'. Sau khi service ổn định, mới ngồi tìm root cause và viết post-mortem — tuyệt đối không làm việc đó lúc 3h sáng."
# Pod statuskubectl get pods -n production --sort-by='.status.startTime'# Error rate (Prometheus)sum(rate(http_server_requests_seconds_count{status=~"5.."}[1m])) /sum(rate(http_server_requests_seconds_count[1m]))# ALB target healthaws elbv2 describe-target-health --target-group-arn $TG_ARN
Đồng thời: check AWS Health Dashboard (infra hay code?), check Jenkins/GitHub Actions history (có deploy gần đây không?).
[!IMPORTANT]
Alert phải đo trải nghiệm người dùng (error rate, latency p99) — không phải CPU/RAM. CPU spike chưa chắc là incident; user nhận 500 mới là incident.
# Lý do pod chếtkubectl describe pod <pod-name> -n production | grep -A5 "Last State"# Events gần nhấtkubectl get events -n production --sort-by='.lastTimestamp' | tail -20# Log trước khi crashkubectl logs <pod-name> -n production --previous --tail=100
kubectl describe sẽ chỉ thẳng vào một trong 4 scenario bên dưới.
Thiếu -XX:+UseContainerSupport → JVM đọc RAM node (32GB) thay vì container limit (2GB) → heap vượt limit → kernel kill
Session object tích lũy (~2MB/session), không expire
Query trả về 100k+ rows load toàn bộ vào heap
Mitigate ngay:
# Rollback nếu có deploy gần đâykubectl rollout undo deployment/api-server -n production# Tăng limit tạm thời nếu cần thêm thời giankubectl set resources deployment/api-server -n production --limits=memory=4Gi# Scale thêm pod để giảm tải mỗi instancekubectl scale deployment/api-server --replicas=10 -n production
# Spring Boot log:HikariPool-1 - Connection is not available, request timed out after 30000ms
# Prometheushikaricp_connections_pending # > 0 liên tục = đang exhaustedhikaricp_connection_timeout_total # đang tănghikaricp_connections_active # so với maximumPoolSize# Connections thực tế trên RDSSELECT count(*), state FROM pg_stat_activity GROUP BY state;
maxLifetime trùng với TCP timeout RDS → connection "active" nhưng đã dead
Slow query giữ connection suốt thời gian RDS Multi-AZ failover (30–60s)
Mitigate ngay:
-- Kill slow queries đang blockSELECT pg_terminate_backend(pid)FROM pg_stat_activityWHERE state = 'active' AND query_start < NOW() - INTERVAL '30 seconds' AND query NOT LIKE '%pg_stat_activity%';
kubectl rollout restart deployment/api-server -n production# Giảm pod count tạm thời → giảm tổng connections đến RDSkubectl scale deployment/api-server --replicas=3 -n production
# ElastiCache configmaxmemory: 3gb # 75% RAM của node 4GB — không để 100%maxmemory-policy: allkeys-lru
[!IMPORTANT]
Controlled ramp-up sau restore: khi Redis vừa phục hồi, warm cache dần với rate-limited preloader trước khi mở full traffic. Mở đột ngột = thundering herd tái diễn.
Bài học từ Cloudflare 2023: flood reconnecting clients overload hệ thống vừa recover.
□ Confirm sự cố thật (error rate, pod status, ALB health)□ Check AWS Health Dashboard — infra hay code?□ Tạo Jira INC + Teams channel□ Assign IC (coordinate) + Ops (hands-on)□ kubectl describe → OOMKilled / HikariCP / Kafka lag / Redis?□ Có deploy gần đây? → Rollback ngay□ Update team mỗi 10-15 phút□ Confirm stable → declare resolved□ Schedule post-mortem (không làm 3h sáng)
❌ "Tôi sẽ check logs trước để tìm nguyên nhân"
→ Tại sao sai: logs giúp tìm root cause, không giúp service recover nhanh hơn. Trong khi bạn đọc logs, 10,000 users vẫn đang bị ảnh hưởng.
✅ Đúng hơn: rollback hoặc scale out trước, đọc logs song song hoặc sau.
❌ "Tôi sẽ tự xử lý, không cần wake up ai lúc 2h sáng"
→ Tại sao sai: nếu bạn bị block hoặc cần thông tin mà người khác biết, incident kéo dài hơn. Không ai muốn bị gọi lúc 2h, nhưng tất cả đều đồng ý đây là đúng khi có SLA.
✅ Đúng hơn: alert team ngay, ít nhất là thông báo — để họ quyết định có tham gia không.
❌ "Restart server là xong"
→ Tại sao sai: restart giải quyết triệu chứng, không giải quyết nguyên nhân. Pod sẽ OOMKilled lại sau vài phút nếu không fix JVM config.
✅ Đúng hơn: restart là mitigation tạm thời, phải theo sau bởi root cause investigation.
❌ "Tôi báo cáo sau khi resolve xong"
→ Tại sao sai: stakeholders cần biết đang xảy ra gì để quyết định (delay launch, thông báo khách hàng, escalate). Im lặng 45 phút rồi báo "xong rồi" là tệ hơn nhiều so với update liên tục.
✅ Đúng hơn: update mỗi 10–15 phút, kể cả khi chỉ nói "vẫn đang điều tra".
❌ "Reset Kafka offset về latest để giải quyết lag"
→ Tại sao sai: với order/payment topics, reset = mất data, business loss có thể lớn hơn downtime.
✅ Đúng hơn: quyết định reset phải có Product Owner sign-off, chỉ áp dụng với non-critical topics (notification, analytics).
Escalate khi: incident kéo dài > 30 phút chưa có mitigation rõ ràng, hoặc impact vượt ngưỡng SLA (revenue loss, data loss risk, số user bị ảnh hưởng lớn). Nguyên tắc: thà escalate sớm rồi update "đã ổn" còn hơn để leadership bị bất ngờ. Jira INC ticket đã tạo từ đầu giúp leadership tự theo dõi được status mà không cần hỏi.
Theo thứ tự: feature flag kill switch → tắt tính năng bị lỗi qua config (không cần deploy) → maintenance mode (503 + thông báo) → scale out để giảm error rate từng pod. Bắt đầu hotfix song song nhưng không deploy cho đến khi test kỹ trên staging với load test mô phỏng production traffic.
Phụ thuộc hoàn toàn vào business: notification/analytics/recommendation → reset offset về latest, bỏ backlog (dữ liệu cũ không còn giá trị). Order/payment/inventory → phải xử lý hết, scale consumers + tăng throughput. Quyết định phải có Product Owner sign-off — kỹ sư không tự reset offset trên critical topics.
Blameless post-mortem trong Confluence trong vòng 48 giờ sau incident: timeline từng phút, root cause (5 Whys), contributing factors, impact measurement (users bị ảnh hưởng, revenue loss ước tính, SLA breach). Action items phải cụ thể — có owner, có deadline, có Jira ticket — không để chung chung "cần cải thiện monitoring". Câu hỏi cốt lõi: "Hệ thống/process nào đã thất bại?" — không phải "Ai đã làm sai?".