Bài tóm tắt
Tóm tắt bằng lời riêng, luôn dẫn về bài gốc. 531 bài (đã lọc). Đọc miễn phí.
Nguồn dữ liệu danh sách bài viết của blog công ty
Danh sách bài trên trang công ty gồm 10.013 bài. Khoảng 73,6% (7.365 bài) do SWE Wiki thu thập thủ công từ kho lưu trữ blog chính chủ của các công ty, kèm ngày đăng. Phần còn lại lấy từ các danh sách công khai trên GitHub: binhnguyennus/awesome-scalability (667), abhivaikar/howtheytest (551), upgundecha/howtheysre (499), eugeneyan/applied-ml (376), Engineer1999/ML-System-Design-Case-Studies (239), upgundecha/howtheyaws (149) và một số danh sách nhỏ khác. Mọi link luôn dẫn về bài gốc trên blog của tác giả; SWE Wiki không sao chép nội dung bài. Hiện 9.115 bài thuộc 135 công ty có trang wiki riêng và 897 bài thuộc 261 trang danh sách bài viết (công ty chưa có trang wiki); thành viên xem được toàn bộ danh sách. Cảm ơn những người duy trì các danh sách đó.
Active-Active Shared-Nothing Database Architecture
Một DB sập kéo theo nhiều service; CTO hỏi "năm 2020 rồi, sao không chạy DB active-active?". Bài giải thích vì sao active-active shared-nothing (AASN) ở tầng DB, tức là hai bản DB ở hai vùng, cùng nhận ghi, nhân bản hai…
Terraform Poka-Yokes: Writing Effective, Scalable, Dynamic, and Error-Resistant Terraform
Tác giả hỗ trợ sáu team chạy hơn 75 microservice trên ECS; môi trường non-prod có ngày tới khoảng 100 lần deploy. Mục tiêu: hỗ trợ được nhiều team mà không cần thêm người theo tỉ lệ 1–1, và developer tự quản ứng dụng…
Designing Clear Street's First Transactional Outbox Pattern
Từ khi bắt đầu năm 2018, mỗi microservice có hai API: gRPC cho CRUD, và một API streaming qua Kafka phát lại chính các thay đổi đó để service phía sau khỏi phải poll.
Why Discord is switching from Go to Rust
Service Read States ghi nhận kênh/tin nào mỗi user đã đọc. Nó nằm trên đường nóng: mỗi lần kết nối, gửi tin hoặc đọc tin đều gọi tới.
How we migrated Dropbox from Nginx to Envoy
Hạ tầng traffic dựa trên Nginx gần mười năm: hàng chục triệu kết nối mở, hàng triệu request/giây, hàng terabit bandwidth. Cấu hình phần lớn tĩnh, sinh bằng Python 2 + Jinja2 + YAML (cả ba đều cho logic, không có mô hình…
Prefetch Caching of Items at eBay
Phần lớn traffic vào trang item đến từ trang kết quả tìm kiếm. Những năm trước eBay đã prefetch ảnh item sau khi trang tìm kiếm tải xong. Lần này họ muốn phục vụ cả trang item từ cache khi user bấm vào từ kết quả tìm…
5-year Evolution of Ele.me's Transaction System - Part 2
DB đơn hàng: 1 primary MySQL + 5 secondary + 1 node cho MHA. Không chịu được tải đột biến: nếu phòng kinh doanh không báo trước khuyến mãi thì secondary sập và chỉ còn biết chuyển qua lại giữa các DB.
5-year Evolution of Ele.me's Transaction System - Part 4
Sau khi shard (đầu 2016), nút cổ chai dời từ DB sang Redis (khoảng 6/2016). Twemproxy và Codis gặp nhiều vấn đề, nên Ele.me tự viết proxy Redis corvus có đủ metric (bộ nhớ, kết nối, hit rate, số key). Code dùng Redis…
5-year Evolution of Ele.me's Transaction System - Part 5
Incident RabbitMQ: test hiệu năng cho thấy throughput ổn, nhưng thực tế CPU cao tới mức kích hoạt cơ chế tự bảo vệ của RabbitMQ, chặn producer. Gốc nằm ở client RabbitMQ do một phòng khác tự đóng gói, dùng sai chế độ…
5-year Evolution of Ele.me's Transaction System - Part 6
Tách giao dịch thuận và nghịch (giữa 2016): giao dịch nghịch (hoàn, huỷ, khiếu nại) chỉ chiếm khoảng 1% đơn nhưng logic phân nhánh phức tạp hơn nhiều. Giao dịch thuận cần hiệu năng, đồng thời, ổn định. Hai bên khác nhau…
Autoscaling in Kubernetes: Why doesn't the Horizontal Pod Autoscaler work for me?
Chủ ứng dụng ở Expedia bật HPA theo tài liệu (ví dụ: scale khi CPU trung bình quá 80%) rồi thấy nó "không chạy". Series đặt bốn tiêu chí cho autoscaling: reliability, efficiency, responsiveness, resilience; bài này chỉ…
Inside Figma: a case study on strict null checks
Figma dùng TypeScript từ trước bản 2.0 (khi strictNullChecks ra đời); code mới vẫn không nhất thiết qua được cờ này. Bật cờ trên frontend khoảng 1.162 file sinh hơn 4.000 lỗi, sửa một lỗi thường lộ thêm lỗi khác.
From 48k lines of code to 10: the story of GitHub's JavaScript SDK
@octokit/rest khởi đầu là package cộng đồng github (commit đầu 6/2010, thời Node v0.1). Năm 2017 GitHub nhận nó làm SDK chính thức cho REST API, chạy cả Node lẫn trình duyệt; lúc đó khoảng 16.000 dòng, lõi là…
How we scaled async workload processing at GitLab.com using Sidekiq
GitLab (Rails) xử lý việc nền bằng Sidekiq trên Redis. Lịch sử: 2013 mỗi worker class một queue, không ai quản; 2016 gom theo tính năng; 2017 lại mỗi worker class một queue, gom thành nhóm realtime, asap, besteffort để…
Fear-free PostgreSQL migrations for Rails
Postgres là database mặc định của GoCardless, đứng sau monolith API chính (Rails). Schema đổi qua migration của Rails.
Incident review: Service outage on 25 October 2020
GoCardless quản lý secret bằng HashiCorp Vault chạy trên Kubernetes: kỹ sư tự ghi secret (không đọc được), ứng dụng chỉ đọc secret của chính nó theo service account. Vault là phụ thuộc của gần như mọi service production.
How We Upgrade Kubernetes on GKE
Kubernetes ra một bản minor mỗi quý; team Engineering Platform của Gojek phải theo kịp trên nhiều cluster GKE.
Three months, 30x demand: How we scaled Google Meet during COVID-19
Từ 17/2/2020, SRE của Meet nhận page về năng lực theo region (alert kiểu triệu chứng: "quá nhiều task lỗi", "cắt tải quá nhiều"), bắt đầu ở châu Á rồi Ý. Dùng lượng tăng 30 lần trong khoảng ba tháng; lúc kết thúc có hơn…
GoCD on Kubernetes
Mục tiêu của Platform Team ở Hotstar: tự động hoá mọi bước can thiệp tay trong deploy, từ lúc merge vào trunk tới production. Muốn vậy, không chỉ code mà cả script deploy, hạ tầng, cấu hình ứng dụng đều phải được…
Finding memory leaks with Memtrace
Trước đó OCaml có Spacetime: ghi mọi lần cấp phát. Tìm leak tốt nhưng overhead cao, cần một cấu hình compiler riêng, profile rất lớn và cần rất nhiều RAM để xử lý.
Production testing with dark canaries
Code ở LinkedIn có thể lên production trong vòng một giờ, nhiều lần mỗi ngày; code, config hay model AI xấu vẫn gây incident dù có unit và integration test. Một số thứ (bộ nhớ, CPU/GPU, concurrency, latency) chỉ đo đúng…
How LinkedIn handles merging code in high-velocity repositories
Gần 10 năm trước (tức khoảng 2010) LinkedIn bỏ một codebase monolith sang microservice, mỗi team một repo. Năm 2020: hàng nghìn dev, hơn 10.000 repo đang hoạt động, có repo hơn 300 commit/ngày. Trunk-based development.
DataHub: Popular metadata architectures explained
Tác giả từng xây Espresso, Databus, Kafka; khi sang team hạ tầng analytics (Hadoop) thấy người ta hỏi nhau "dataset nào đúng" suốt: lưu trữ và tính toán đã scale nhưng tìm dữ liệu thì chưa.
Our Evolution Towards T-REX: The Prehistory of Experimentation Infrastructure at LinkedIn
2020: T-REX (Targeting, Ramping, and Experimentation) phục vụ tới 41.000 A/B test cùng lúc trên hơn 700 triệu thành viên; gồm targeting, cấu hình động, hạ tầng thí nghiệm, pipeline báo cáo, thông báo, UI.