Deploy và release an toàn

Chủ đề Dành cho thành viên
Bài đọc thử: 2/3 · còn 1 bài miễn phí · Xem gói thành viên

Bài toán

Phần lớn sự cố bắt đầu bằng một thay đổi: code mới, cấu hình mới, hạ tầng mới. Khi hệ thống và tổ chức lớn lên, câu hỏi là làm sao đưa thay đổi lên production thường xuyên mà vẫn giới hạn được thiệt hại khi có lỗi.

Diễn tiến theo thời gian

  • 2013 · Twitter: sau khi tách service, không thể dựa vào deploy để phối hợp ra mắt tính năng nữa. Decider bật/tắt tính năng đồng loạt trên nhiều service, theo % traffic hoặc %; code deploy ở trạng thái "off" rồi tăng dần. Hơn 50 lượt deploy mỗi tuần. Twitter 2013
  • 2013→2020 · LinkedIn: code lên production trong một giờ, nhiều lần mỗi ngày, nên cần thử code/config/model AI mới bằng traffic thật mà không ảnh hưởng người dùng: dark canary cluster nhận bản sao request đọc (side effect phải chặn), response bị bỏ; đặt trong service discovery D2 để co giãn cụm không làm hỏng mapping. LinkedIn 2020
  • 2014 · Amazon: sau khi chuyển sang SOA với team nhỏ tự chủ, deploy thành nút cổ chai; Apollo là dịch vụ deploy chung: developer mô tả cách cài lên một máy, Apollo điều phối cả fleet bằng rolling update, chia đều theo data center, tự dừng khi số máy lỗi vượt ngưỡng, rollback thì cập nhật máy lỗi trước. Theo Vogels, 50 triệu lần deploy trong 12 tháng (hơn một lần mỗi giây). Amazon 2014
  • 2014 · WhatsApp (qua HighScalability): không mô phỏng được đỉnh như nửa đêm Giao thừa, nên thay đổi rủi ro chạy trên một phần nhỏ traffic rồi mới mở rộng; nâng BEAM bằng rolling restart, hot patch không restart là hiếm. WhatsApp 2014
  • 2015 · GoCardless: một schema migration "vô hại" (thêm foreign key tới một bảng nóng) xếp hàng chờ khoá AccessExclusive và chặn mọi query, gây ~15 giây downtime. Khuyến nghị: lock_timeout trong migration, chia nhỏ DDL, loại bỏ transaction dài. GoCardless 2015
  • 2015→2016 · Ele.me: release message broadcast lúc 8 giờ tối gặp lỗi HAProxy, phải bật/tắt công tắc và tăng dần 5% → 10% → 30%. Sau đó dựng team test, test tích hợp tự động hằng sáng và performance test riêng; độ phủ unit test 80–90%. Ele.me 2020 Ele.me 2020
  • 2015 · Wix: với CD, hệ experiment (A/B + feature toggle) là cổng bật/tắt cho code mới; khi server gửi loại filter mới, client cũ kẹt ở danh sách experiment cũ, nên loại lạ phải thất bại về phía an toàn (không ai đủ điều kiện, trả dự phòng). Wix 2015
  • 2016 · Grab: chuyển từng endpoint Rails sang Go: unit test → load test bằng log thật → QA staging → shadow trên production → rollout theo RPS, rollback được ngay. Bài học: 1% traffic của một endpoint lớn có thể hơn toàn bộ endpoint khác. Grab 2016
  • 2016 · Uber (qua HighScalability): theo Matt Ranney, Uber ổn định nhất vào cuối tuần khi ít ai thay đổi gì; load test trên production phải đánh dấu traffic test xuyên suốt hệ thống. Uber 2016
  • 2016→2024 · GitHub: gom PR để deploy trước merge: từ "train" thủ công (tối đa 15 PR, một PR xấu kéo cả nhóm) sang merge queue tự gom nhóm và tự loại PR xung đột; deploy được 30 PR trở lên một lần, thời gian chờ ship −33%. GitHub 2024
  • 2016→2026 · Allegro: release train thủ công cho service render frontend (hơn 1.200 component, 120 team) đổi thành registry phiên bản: phiên bản mới mặc định tắt, team tự bật theo môi trường (Production 0% → 5%, tối thiểu 10 phút → 95%); service tự deploy ba lần mỗi ngày qua canary 1% → 10%, dừng khi có lỗi hoặc đang có sự cố; alert lỗi render thẳng tới team chủ. Allegro 2026
  • 2016 · Stack Overflow: 5–10 lần deploy production/ngày, push tới deploy xong dưới 9 phút. Mỗi web server: DRAIN ở HAProxy → chờ request xong → dừng IIS → chép file → bật lại → chỉ nhận traffic sau 3 lần health check (MAINT dồn traffic khi app chưa ấm, làm đói ThreadPool). Static asset deploy trước code để tránh cache sai hash ở CDN. Stack Overflow 2016
  • 2017 · Yahoo: mọi sản phẩm đang hoạt động deploy từ commit tới production tự động; rollback là chạy lại một phase của pipeline tại trạng thái đã lưu (SHA + metadata deploy), chọn phiên bản trong dropdown; ai có quyền ghi cũng làm được, giúp chuyển sang DevOps. Yahoo 2017
  • 2017 · Dropbox: Giữ app ở trạng thái lai Python 2/3 khoảng 7 tháng (nội bộ rồi Beta), chọn interpreter lúc khởi động, dựa vào crash report gộp trước khi mở cho Stable. Dropbox 2019
  • 2018→2019 · GitLab: release tháng với feature freeze (ngày 7 → 22) gây "panic merge"; team Delivery dành 60% thời gian trông deploy. Họ làm CD trên hạ tầng cũ trước (tự động 90% release, rollout nhóm nhỏ user, dừng khi lỗi nặng), rồi mới lên Kubernetes. Số deploy từ khoảng 7 (5/2019) lên 35 (8/2019). GitLab 2019
  • 2018 · Coinbase: hàng trăm deploy mỗi ngày qua Odin: release khai báo dạng JSON, blue/green dùng một lần (ASG mới, chờ khoẻ, xoá ASG cũ), khoá chống deploy đồng thời, trạng thái kết thúc tách "thất bại đã dọn" khỏi "thất bại còn rác"; Codeflow cho mọi engineer deploy khi code đã review thay vì chỉ nhóm tin cậy. Coinbase 2018
  • 2018 · Dropbox (desktop): đổi runtime của phần mềm cài trên máy người dùng bằng feature gate từ xa (Stormcrow) chọn Python 2 hay 3 lúc khởi động; mở theo kênh nhân viên → Beta → Stable, không mở rộng khi còn bug migration chưa sửa. Dropbox 2018
  • 2018 · Jane Street: môi trường Python cho notebook từ Conda sửa được tại chỗ → XAR bất biến theo revision, roll và rollback nguyên khối; tag nightly (liên tục) và stable (theo lịch, không bao giờ đổi); code "leaf" vẫn sửa tại chỗ cho nhu cầu hotfix nhanh (bài 2023). Jane Street 2023
  • 2018 · Dropbox: Canary theo tỉ lệ ở proxy: nhiều hàng đợi có trọng số cho một upstream (ví dụ 90/10), đổi cấu hình nóng có hiệu lực trong vài giây. Dropbox 2018
  • 2019 · Discord: service Read States viết lại bằng Rust: load test, rồi một canary node, sửa edge case, rồi rollout cả fleet. Discord 2020
  • 2019 · Mozilla: không có kênh vá khẩn cấp riêng nên bản sửa chứng chỉ phải đi qua hệ thống thí nghiệm (gắn Telemetry). Vá vội thiếu QA nên phải ra 8 bản add-on và 6 dot release. Hành động sau đó: kênh cập nhật nhanh không gắn Telemetry, và có QA trong đội xử lý sự cố. Mozilla 2019
  • 2019 · GitLab: bật Elasticsearch trên GitLab.com bằng index chọn lọc, bắt đầu với group nội bộ gitlab-org (2,2 triệu document) sau một production readiness review; staging cũ hơn một năm và nhỏ hơn nhiều nên vài bug scale chỉ lộ trên production. GitLab 2019
  • 2019 · Tinder: logic xếp hạng chạy bên trong cụm Elasticsearch được phát hành như code: staging → cụm canary chép dữ liệu production (bắt trường ngày lệch kiểu) → dark run fire-and-forget trên production vài ngày (bắt rò bộ nhớ) → tăng dần traffic; nạp jar lúc chạy nên không restart cụm. Tinder 2019
  • 2019 · Tinder: nền tảng experimentation Phoenix tách feature gating (kiểm soát ai thấy) khỏi thí nghiệm (so sánh); gán treatment bằng hash định danh với experiment ID làm salt và shuffle ID để xáo lại; experiment family ngăn một user vào hai thí nghiệm cạnh tranh. Levers (remote config) tách giao trải nghiệm khỏi bản phát hành app: rollback cấu hình mất vài giây, client có manifest kiểu và giá trị mặc định. Tinder 2019 Tinder 2019
  • 2019 · Yelp: model mới qua dark launch (sinh dự đoán trên traffic thật nhưng không hiện), kiểm offline = online và latency trong SLO, rồi rollout chậm để bắt vòng phản hồi mà dark launch không thấy. Yelp 2019
  • 2019→2021 · Slack: cấu hình Envoy sinh từ thư viện Chef thành một file, chạy envoy --mode validate trước khi cài, không bao giờ ghi cấu hình trung gian; bộ test sinh lại cấu hình của mọi team dùng thư viện để thấy thay đổi thư viện ảnh hưởng ai. Slack 2021
  • 2019 · LinkedIn: model của FollowFeed (service stateful) đóng gói thành data pack chỉ gồm file tĩnh, deploy qua CI/CD tách khỏi deploy code: 3 ngày → 30 phút. LinkedIn 2019
  • 2020 · GitHub: số developer gấp đôi làm deploy bằng chatops trong một kênh Slack quá tải. Họ chuyển sang deploy dạng máy trạng thái: canary 2% → canary 20% → 100%, các gate hẹn giờ 5 phút, một lệnh khởi động, UI tổng hợp, rollback nhanh. GitHub 2021
  • 2020 · Airbnb: deep integration test cho mọi service trước merge không scale. Chuyển sang tháp test: CI chỉ test một service với mock; CD (Spinnaker) chạy deep test trên staging + automatic canary analysis. Airbnb 2020
  • 2020 · GoCardless: migration schema đi qua một compiler (Nandi) từ chối thao tác khoá nguy hiểm trước khi chạy, thay cho việc dựa vào trí nhớ của reviewer. GoCardless 2020
  • 2020 · Gojek: nâng Kubernetes mỗi quý: master trước, node pool từng zone bằng surge upgrade, tắt autoscaling trong lúc nâng, thử đúng bộ phiên bản trên staging; release channel stable và maintenance window. PodDisruptionBudget đặt minAvailable bằng số pod đang chạy sẽ chặn luôn việc nâng cấp. Gojek 2020
  • 2020 · Disney Hotstar: đổi Jenkins sang GoCD trên Kubernetes để artifact và lần chạy pipeline ánh xạ một-một (hết ghi version production vào wiki), có value stream map; agent là pod tạm lấy secret từ Vault qua init-container theo service account; pipeline và cả cấu hình GoCD là code (YAML, sops), kiểm tra bằng preflight vì một cấu hình sai chặn mọi thay đổi sau. Tự viết backup volume và Prometheus exporter cho chính công cụ deploy. Disney Hotstar 2020
  • 2020 · Shopify: trong lúc deploy, hai phiên bản code đọc ghi chung cache; định dạng serialize gắn với cấu trúc class biến refactor thành sự cố mà CI không bắt được. Shopify 2022
  • 2020 · Wix: artifact đi qua ba bậc SNAPSHOT → RC → GA bằng promote (không build lại); mọi thao tác RC/GA/rollback qua cổng Lifecycle và được ghi lại, nên dễ tương quan thay đổi với sự cố. Trước đó (khoảng 2011) deploy là FTP artifact lên production bằng tay. Wix 2020
  • 2020 · Zerodha: luật nghiệp vụ do đội rủi ro viết là một kiểu bản phát hành: mỗi luật tự mang test case (TestData), server validation build + chạy test trước khi lưu, server compiler biên dịch thành Go plugin rồi hot reload vào Veto production; chèn hằng timestamp để plugin nạp lại được vì Go không unload plugin. Zerodha 2020
  • 2020 · GitLab: đổi cách push mirror tính ref (fetch → ls-remote) theo bốn bước: chạy song song và log khác biệt khoảng một tháng, tách hai đường bằng feature flag, bật mặc định cho self-managed để dễ lùi, rồi xoá đường cũ. Bài 2021. GitLab 2021
  • 2020→2021 · Dropbox: deploy hằng ngày của monolith hay bị rollback cả cụm vì bug ở phần không liên quan; Atlas tách mỗi servlet một pipeline với ba deployment canary/control/production (control khởi động lại bản cũ cùng lúc với canary để so công bằng), tự dừng và rollback, lỗi chỉ ảnh hưởng một cluster. Dropbox 2021
  • 2020 · Etsy: "Slush" mùa lễ (hơn mười năm): không đóng băng hoàn toàn mà nâng chuẩn cho thay đổi có thể làm phiền người bán, đội hỗ trợ, hạ tầng. Vẫn deploy giờ cao điểm Cyber Monday (biên dịch lại trên hơn 1.000 host) không sự cố nhờ hơn mười năm continuous deployment. Etsy 2021
  • 2021 · Riot Games: pipeline của Legends of Runeterra (khoảng 100 lượt/ngày, 60 phút mỗi lượt): nhánh phân cấp feature → team → main vì rẽ thẳng từ main làm vỡ main quá thường; môi trường test riêng cho từng nhánh, tự xoá khi đóng ticket; build Iteration nhanh nhưng commit status vẫn báo thất bại, Merge Readiness đầy đủ bắt buộc trước merge. Pipeline phụ thuộc khoảng 50 dịch vụ: 0,99^50 ≈ 60%. Riot Games 2021
  • 2021 · Stack Overflow (bài quan điểm): theo tác giả, deploy bằng tay, theo chu kỳ, gom thay đổi của nhiều người là gốc của vòng xoáy lead time dài → diff lớn → thêm người chữa triệu chứng. Đề xuất: mỗi merge tự deploy trong khoảng 15 phút, không cổng người duyệt; bắt đầu từ service mới. Stack Overflow 2021
  • 2021 · PayPal: model chống gian lận trước đây đóng chung build image theo lịch phát hành cố định, model lỗi thì rollback cả pool live. Quokka tách model khỏi lịch của code: CI/CD riêng cho model, audit pool nhận traffic production lấy mẫu, đọc cùng DB nhưng không tham gia quyết định; đạt SLA P99 và phân phối điểm thì tốt nghiệp lên production bằng cùng pipeline. Theo PayPal: không còn rollback do model lỗi. PayPal 2021
  • 2022 · Monzo: hơn 2.100 service, hơn 100 deploy/ngày. Rollback tự động bằng Argo Rollouts dựa trên ngưỡng alert chung (lỗi RPC trên 20%, panic, lỗi DB); migration và tích hợp công cụ chiếm hơn 90% công sức. Monzo 2022
  • 2022 · Vitess: schema change trên MySQL qua bảng bóng; cut-over giới hạn thời gian chờ (đệm 10 giây, hết hạn thì query lỗi chứ không treo vô hạn) và tự quay lui khi lỗi. Vitess (PlanetScale/CNCF) 2022
  • 2022 · Mozilla: thay đổi gây sự cố không phải của Mozilla: GCP đổi mặc định HTTP/3 của load balancer mà không báo. Bài học: chọn cấu hình tường minh thay vì "default", và đưa tổ hợp phiên bản giao thức vào system test. Mozilla 2022
  • 2022 · Monzo: ngân hàng mà quy trình thay đổi chỉ cần một review; engineer tăng 148 → 232 mà số deploy mỗi người tăng, sự cố giảm. Theo Monzo, mọi ma sát đều đẩy người ta gom thay đổi thành bản lớn; kiểm soát rủi ro nằm ở guardrail tự động và rollback tự động theo metric (đang làm), không ở người phê duyệt. Monzo 2022
  • 2022 · Dream11: blue-green chuyển dần ở tầng DNS (Route53 weighted; mỗi service đã shard qua nhiều load balancer vì quota 1.000 EC2/LB). Làm ấm LB, green không nhỏ hơn blue, chuyển từng phần theo metric, dừng khi bất thường; rollback muộn bằng metadata lưu S3 để dựng lại blue. Dream11 2022
  • 2022 · Achievers: canary với Argo Rollouts truy vấn New Relic để phân tích lỗi và tự rollback; developer chọn từ thư viện template phân tích dựng sẵn. SLO và error budget đặt cùng product owner, người cam kết dừng làm tính năng khi không đạt. Achievers 2022
  • 2022 · Spotify: tự merge thay đổi do máy tạo khi qua test, theo dõi sức khoẻ sau merge; rollout theo cohort cho pipeline batch (test trước merge yếu, phản hồi chậm), phiên bản chỉ lan tiếp khi cohort trước đạt tỉ lệ chạy thành công trên ngưỡng. Spotify 2023
  • 2023→2025 · Uber: chuyển hơn 2.800 service Go sang máy Arm theo ba trục giới hạn bán kính hỏng: theo tier (có production readiness review sau mỗi đợt), non-prod trước prod, từng zone; test chạy mỗi lần deploy, tự revert khi có alert hay SLA xấu đi. Nền tảng tự quay về x86 nếu service lỡ deploy ảnh chỉ một kiến trúc. Uber 2025
  • 2023 · Stack Overflow: trên Azure: ảnh VM bất biến dựng bằng Packer chạy trên VMSS, app deploy riêng bằng Octopus (build ảnh mất vài giờ, deploy app vài phút); health endpoint chỉ khoẻ khi cả 6 app trên VM sẵn sàng, app lỗi thì VMSS dừng rolling. Stack Overflow 2023
  • 2024 · Canva: canary chỉ đo tỷ lệ lỗi JS nên mù với request treo. Sau sự cố họ thêm sự kiện "tải trang xong" làm chỉ số canary, thêm một bậc rollout và timeout khi tải asset. Canva 2024
  • 2024 · Slack: Chef cho hàng chục nghìn EC2 từng là một stack, mọi môi trường nhận cookbook cùng lúc mỗi giờ. Chia nhiều stack (Route53 có trọng số), Chef Librarian upload phiên bản bất biến lên mọi stack rồi chỉ đổi con trỏ môi trường, promote sandbox → dev → prod với key S3 để chặn. Slack 2024
  • 2024 · Deno: deployment là artifact bất biến (transpile, vendor mọi dependency, sắp theo thứ tự import), đẩy lên bucket toàn cầu trước, rồi mới báo edge proxy cập nhật bảng domain → deployment trong bộ nhớ: deploy là một lần đổi bảng định tuyến, chạy lại cho kết quả y hệt dù URL import đã đổi. Deno 2024
  • 2024 · GitHub: deploy then merge mở rộng sang target data residency: môi trường nhân viên → canary → github.com → EU → mới merge; target nào lỗi thì rollback toàn bộ và chạy lại từ merge queue; pipeline của hơn 100 service được sinh tự động để target mới tự có. GitHub 2024
  • 2024 · OpenAI: thay đổi cấu hình hạ tầng (service telemetry) rollout ra mọi cụm trong 30 phút vì DNS cache làm lỗi hiện ra chậm; sau sự cố: rollout theo pha cho mọi thay đổi hạ tầng, theo dõi cả control plane, cố ý rollout thay đổi xấu để kiểm phát hiện và rollback, break-glass vào API server. OpenAI 2024
  • 2024 · Discord: Dark launch thuật toán nén: nén một phần traffic production bằng cả hai cách, ghi metric rồi bỏ kết quả mới, vòng lặp tính bằng ngày thay vì chờ client hỗ trợ một tháng; rollout thật sau experiment để rollback nhanh. Discord 2024
  • 2025 · Cloudflare: bản vá Tenant Service trong lúc sự cố làm sập API lần hai; theo Cloudflare, nếu service này đã dùng Argo Rollouts thì đợt sập đó đã tự rollback. Cloudflare 2025
  • 2025 · WarpStream: deploy tuần tự từng AZ rồi từng region, nên bản hỏng bị phát hiện trước khi lan; cụm đa region chỉ có một region được deploy tại một thời điểm. WarpStream 2025
  • 2025 · Neon: thay đổi cấu hình AWS CNI giữa sự cố dựa trên đọc tài liệu vội, rồi revert như một việc dọn dẹp mà không kiểm chứng, gây sự cố thứ hai; trả lời cuối cùng nằm trong mã nguồn của plugin chứ không phải tài liệu. Neon 2025
  • 2025 · Anthropic: canary và benchmark trước deploy không bắt được lỗi làm giảm chất lượng đầu ra; khắc phục bằng test phát hiện ký tự bất thường trong quy trình deploy và eval chất lượng chạy liên tục trên production. Bài học phụ: gỡ một workaround vì tin đã sửa gốc làm lộ lỗi mà workaround đang che. Anthropic 2025
  • 2025 · Slack: node mới dựng lấy ngay cấu hình mới nhất từ môi trường prod chung, nguy hiểm khi scale-out. Tách prod thành 6 môi trường theo AZ: prod-1 là canary nhận bản mới mỗi giờ, prod-2–prod-6 đi theo release train; Chef chạy theo tín hiệu promote thay vì cron. Slack 2025
  • 2025 · Doximity: tách code người dùng (DAG) khỏi runtime nền tảng (image Airflow): catalog phiên bản append-only + manifest trạng thái mong muốn + vòng đồng bộ định kỳ; rollback bằng sửa manifest. Doximity 2025
  • 2025 · Anthropic: agent nghiên cứu chạy lâu và có trạng thái, có thể đang ở bất kỳ bước nào khi deploy; dùng rainbow deployment (chuyển traffic dần, hai phiên bản cùng chạy) thay vì cập nhật mọi agent một lúc. Anthropic 2025
  • 2025 · Mercari (mobile): release train hằng tuần cắt nhánh tự động thứ Ba; mọi thay đổi sau feature flag nên master luôn phát hành được; iOS nộp review song song với release judgement (chủ yếu E2E tự động), phased release, crash velocity alert gọi on-call; hotfix dừng phased release, Android rollback được còn iOS thì không. Android ship một build cho mọi vùng, khác biệt theo nước do remote config, đổi lại lỗi trong build ảnh hưởng mọi vùng cùng lúc. Mercari 2025 Mercari 2025
  • 2026 · Discord: một thay đổi cấu hình thường lệ (scale dọc pod, giảm số pod) trong lúc migrate sang Kubernetes làm 17% session dừng đột ngột vì grace period hết trước khi bàn giao xong, kéo theo sự cố voice hơn 3 giờ. Sửa: admission webhook từ chối scale-down khi pod chưa bàn giao xong. Discord 2026
  • 2026 · Coinbase: thay đổi cấu hình qua pipeline chuẩn, đã review, nhưng trùng tên resource nên sửa nhầm ingress gateway; khắc phục bằng guardrail chặn trùng tên lúc deploy và tách công cụ deploy khỏi hạ tầng nó quản lý. Coinbase 2026
  • 2026 · Neon: mỗi thay đổi có điểm risk = xác suất × tác động; điểm càng cao càng qua nhiều kiểm tra ở design (premortem), build (load/failure test, kiểm rollback), release (ramp theo bậc, chủ tính năng theo dõi SLO, readiness review), operate (bàn giao, diễn tập on-call). Neon 2026
  • 2026 · Railway: thay đổi cấu hình CDN lên toàn cầu trong vài phút gây rò dữ liệu giữa user; sau đó rollout CDN chia shard trong nhiều giờ và thêm test hành vi cache trước production. Railway 2026
  • 2026 · Trigger.dev: feature flag thử trên một tổ chức test (không có biến Sensitive) rồi bật toàn cục; tính năng mới gỡ một hành vi đang vô tình che bug ở một đường sync khác. Sau đó: test theo toàn bộ đường đi với dữ liệu biên, gộp quy tắc của các đường code trùng chức năng, bảo vệ phía nhận. Trigger.dev 2026
  • 2026 · Redpanda: rolling restart cụm có trạng thái: health check toàn cụm không đủ (broker có thể giữ replica in-sync duy nhất; pod Ready trước khi bắt kịp replica). Pre-restart probe hỏi chính broker có an toàn không, post-restart probe chờ lấy lại đủ replica mới sang pod sau; probe lỗi thì hoãn (fail closed). Redpanda 2026
  • 2026 · Kubernetes: pipeline promote image chạy lỗi vì rate limit và mất hơn 30 phút; tách thành bảy pha tuần tự (mỗi pha trọn ngân sách rate limit), đưa nhân bản chữ ký ra job riêng, timeout cho mọi request (từng có kết nối treo chặn pipeline hơn 9 giờ). Pha Plan 20 phút → 2 phút; kiểm tra registry chính trước mirror: 17 giờ → 15 phút. Kubernetes 2026
  • 2026 · Slack: Shipyard đổi EC2 sang hạ tầng bất biến: AMI phân lớp (base slack-zero + lớp service), bake nặng lúc build để instance lên trong vài giây, deploy = thay máy qua Gondola có kiểm metric và rollback; Reaper thay máy quá tuổi hoặc bị SSH vào. Slack 2026
  • 2026 · DoorDash: vòng đời feature flag phải có bước xoá; flag chết là nhánh ngủ có thể bị bật nhầm. Dọn tự động cần trạng thái rollout thật từ nền tảng experimentation (rollout dở dang thì người quyết hoàn tất hay rollback trước). DoorDash 2026
  • 2026 · Together AI (nhà cung cấp): canary đổi model LLM: mỗi bậc scale target trước, health gate, dời traffic, chờ 30 giây cho routing hội tụ, drain source, rồi metric gate so p95 của target với source trong cửa sổ ≥ window + 90 giây; gate hỏng thì dừng chờ người, không tự abort. Lần chạy thật bắt hồi quy 137% ở 10% traffic, chạy ngược với 0/6.800 request lỗi. Together AI 2026
  • 2026 · Uber: index search có hai cột embedding blue/green; trước deploy kiểm đầy đủ (số tài liệu), tương thích ngược (cột đang phục vụ giống từng byte), đúng (phát lại query thật ở non-prod, so recall); lúc phục vụ so model ID của query embedding với cột đang dùng trên request lấy mẫu, lệch thì alert và tự rollback model. Uber 2026
  • 2026 · Rust: trait solver viết lại trong khoảng 4 năm được bật mặc định trên nightly kèm cờ tắt và một issue ghim theo dõi phá vỡ, so hiệu năng với bản cũ trên 20.000 crate tải nhiều nhất, tập trung vào các ngoại lệ tệ nhất, rồi mới ổn định. Rust 2026
  • 2026 · Airbnb (Sitar): dynamic config như code: Git PR + review, schema kiểm trong CI, control plane quyết định rollout theo bậc (zone, phần trăm pod) và rollback, tách khỏi data plane phân phối; sidecar giữ cache local nên backend sập thì service chạy bằng giá trị tốt cuối cùng; đường khẩn cấp qua portal bỏ qua CI nhưng vẫn audit. Airbnb 2026 Airbnb 2026
  • 2026 · Meta/WhatsApp: World Cup: lần này không đóng băng deploy và không hoãn diễn tập DR, các đội ship như thường cả lúc đỉnh; theo Meta là nhờ nhiều năm đầu tư độ tin cậy. Meta 2026
  • 2026 · Discord: Shadow cluster ScyllaDB nhận cùng đọc/ghi như production trước mỗi đổi phiên bản, OS, phần cứng; theo Discord nhiều bug chỉ hiện ở tải của họ, có khi chỉ khi mọi node đã nâng cấp. Đang tự động hoá trọn vòng đời shadow cluster. Discord 2026

Các lựa chọn và đánh đổi

Kỹ thuật Ví dụ Giới hạn thiệt hại bằng cách Cái giá
Feature flag runtime Twitter Decider, Slack "light mode" (Slack 2018) Tách deploy khỏi release; tắt ngay khi lỗi Thêm trạng thái; flag cập nhật lệch giờ giữa các service (Grab 2024)
Canary nhiều tầng GitHub 2%/20%, Discord một node Lỗi chỉ chạm một phần nhỏ trước Lỗi cần nhiều traffic mới lộ thì vẫn lọt tầng nhỏ
Tăng dần theo tải tuyệt đối Grab RPS Không vượt sức chứa downstream Phải biết tải của từng phần
Shadow traffic Grab, Figma, Shopify Kiểm chứng trên production mà user không thấy Lệnh ghi cần cơ chế riêng
Rollout theo tenant/pod Shopify từng pod (Shopify 2026) Khách nhỏ chịu rủi ro trước, khách lớn sau Phải có kiến trúc cô lập tenant
Guard rail tự động trong nền tảng Discord admission webhook Chặn thay đổi nguy hiểm trước khi chạy Phải biết trước bất biến nào cần giữ

Quy tắc rút ra

  1. Tách deploy (đưa code lên) khỏi release (bật cho user). Twitter làm việc này từ 2013.
  2. Tăng dần và có cổng kiểm tra giữa các bước, mỗi bước rollback được (GitHub, Grab).
  3. Thay đổi cấu hình và hạ tầng cũng là deploy, cũng cần canary và guard rail. Sự cố Discord 2026 bắt đầu từ một PR đổi số pod.
  4. Quy trình phụ thuộc con người không scale theo số người (GitHub: gấp đôi developer thì chatops vỡ).
  5. Các tham số an toàn (rate limit, grace period) phải được xem lại khi topology đổi (Discord: VM → Kubernetes).
  6. Rollback tự động dựa trên metric là tầng tiếp theo sau canary (Monzo 2022). Cloudflare 2025 nói rằng thiếu nó thì đợt sập thứ hai đã xảy ra.
  7. Schema migration là deploy: đặt lock_timeout để thà huỷ deploy còn hơn làm sập app (GoCardless).
  8. Vá trong lúc sự cố có thể làm tệ hơn; revert thường an toàn hơn (Cloudflare 2025).
  9. Kiểm chứng nặng nên đặt ở CD (staging + canary analysis), không chặn hết ở trước merge (Airbnb ~2020).
  10. Cấu hình edge/CDN có bán kính toàn cầu: rollout theo shard trong nhiều giờ chứ không vài phút (Railway 2026).
  11. Thử trên tổ chức test chỉ có giá trị khi dữ liệu test phủ các trường hợp biên của dữ liệu thật (Trigger.dev 2026: không có biến Sensitive thì test vẫn qua).
  12. Nâng cấp managed tự động là một deploy mình không kiểm soát: cần cảnh báo trên chỉ số nội tại của dịch vụ đó để thấy sớm (Trigger.dev 2026, ClickHouse).
  13. Ma sát trong quy trình đẩy engineer gom thay đổi thành bản lớn; chuyển kiểm soát từ người phê duyệt sang guardrail tự động trong pipeline và công cụ (Monzo 2022: một review, hơn 100 deploy/ngày). Không đặt mục tiêu cho số deploy hay số rollback.
  14. Blue-green cần chuẩn bị cả phía hạ tầng: làm ấm load balancer, green không nhỏ hơn blue, lưu metadata để rollback muộn khi stack cũ đã bị hạ về 0 (Dream11 2022).
  15. Rolling restart hệ có trạng thái phải hỏi trạng thái replica thật của từng node, chờ bắt kịp rồi mới sang node sau, không chắc thì dừng (Redpanda 2026); Ready của Kubernetes không biết điều đó.
  16. Rollout thay đổi nền tảng theo ba trục: độ quan trọng (tier), môi trường (non-prod trước), vị trí (từng zone), kèm tự revert theo tín hiệu (Uber 2025); PDB đặt sai có thể chặn mọi bảo trì (Gojek 2020).
  17. Các thành phần cơ bản của deploy an toàn trên fleet đã có từ trước 2014: rolling theo phần, chia đều theo data center, ngưỡng tự dừng theo số máy lỗi, rollback thì sửa máy lỗi trước, lịch sử phiên bản theo từng máy (Amazon Apollo). Amazon 2014
  18. Canary và benchmark chỉ bắt được lỗi mà chúng đo: lỗi làm giảm chất lượng đầu ra cần kiểm tra chất lượng chạy liên tục trên production, không chỉ trước deploy (Anthropic 2025); canary dùng cùng nguồn metric với giám sát hằng ngày để tự rollback (Achievers 2022). Anthropic 2025 Achievers 2022
  19. Logic chạy bên trong hệ dữ liệu (script, plugin của cụm search) cũng cần canary trên bản sao dữ liệu thật và dark run trước khi nhận traffic. Tinder 2019
  20. Để hệ thống chặn merge khi chưa có build đầy đủ (commit status), thay vì dựa vào kỷ luật; tách build nhanh để lặp khỏi build đủ để merge. Riot Games 2021
  21. Chính công cụ deploy là hạ tầng production: cần backup, khôi phục, monitoring, cấu hình là code, và mọi lời gọi mạng có timeout (Hotstar 2020 GoCD; Kubernetes 2026 kết nối treo chặn pipeline 9 giờ). Artifact và lần chạy pipeline nên ánh xạ một-một để biết cái gì đang chạy. Disney Hotstar 2020 Kubernetes 2026
  22. Cấu hình hạ tầng cũng cần canary và train: phiên bản bất biến upload mọi nơi rồi chỉ đổi con trỏ môi trường; chia môi trường theo AZ để máy mới dựng không lấy ngay bản hỏng; canary nhận bản nhỏ, thường xuyên (Slack 2024–2025). Đi xa hơn thì thay máy bằng image đã bake thay vì sửa tại chỗ (Slack 2026). Slack 2024 Slack 2025 Slack 2026
  23. Với client không tự cập nhật được (app mobile), cấu hình từ xa là cơ chế rollback chính; client cần manifest kiểu và giá trị mặc định vì lệch phiên bản với server là bình thường. Tách cờ dùng để kiểm soát rollout khỏi thí nghiệm dùng để đo. Tinder 2019 Tinder 2019
  24. Khi capacity khởi động chậm (GPU), mỗi bậc rollout: capacity đi trước traffic khi lên, traffic đi trước capacity khi xuống; gate chỉ đọc traffic của bậc hiện tại, đủ mẫu, và chờ ít nhất cửa sổ đo + độ trễ ingest. Gate hỏng có thể là thay đổi có chủ đích, nên dừng chờ người là một lựa chọn có lý do. Together AI 2026 Xem Hạ tầng phục vụ LLM inference.
  25. Deployer cần quyền rộng nên chính nó phải bị giới hạn (ai gọi, tài nguyên tham chiếu bằng tag cho đúng project, chống replay, audit); thay máy mới mỗi lần deploy kèm tuổi máy tối đa thì vá lỗi và chống trôi cấu hình đi kèm deploy. Coinbase 2018
  26. Artifact thay đổi nhanh (model, feature) cần lịch phát hành riêng và một bước shadow trên traffic thật trước khi tham gia quyết định; đóng chung với code nền thì một model lỗi là rollback cả pool. PayPal 2021 Xem Nền tảng ML (feature, training, serving, giám sát model).
  27. Dynamic config là deploy không qua build: PR + review + schema trong CI, rollout theo bậc và rollback do control plane quyết, tách khỏi data plane giao config; phía service đọc từ cache local để hệ config sập thì vẫn chạy bằng giá trị tốt cuối cùng, và khởi động từ snapshot tĩnh để không phụ thuộc hệ config lúc deploy hàng loạt (Airbnb 2026). Airbnb 2026 Airbnb 2026

Câu hỏi mở