5-year Evolution of Ele.me's Transaction System - Part 3
Bài tóm tắt Ele.me 2020 2. Tăng trưởng Độ khó: Dễ
Ele.me · 2020 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc
Phần 3/6. Trước: Ele.me 2020; sau: Ele.me 2020.
Bối cảnh
Team giao dịch chưa từng có kỹ sư test; mọi thứ do R&D tự test bằng tay. Team framework cho rằng kỹ sư phải tự bảo đảm chất lượng. Tác giả thấy vậy là quá lý tưởng, nên chia vai: R&D chịu trách nhiệm chất lượng code, kỹ sư test làm công cụ để giảm chi phí test. Đầu 2016 có kỹ sư test đầu tiên, đến tháng 4 có 4 người.
Thay đổi chính
- Test tích hợp tự động (WeBot): Robot Framework (keyword-driven) + Jenkins + giao diện Django để ghép test case như khối lắp ghép. Nền tảng giao diện thất bại vì thiếu người làm frontend. Phần còn lại (Jenkins + Robot, test case trong Git, chạy mỗi sáng trên nhánh mới) thì giữ được và là chỗ dựa cho các đợt tách và refactor sau.
- Performance test riêng bằng Locust (Python, gắn được với framework SOA, khác với full-pipeline test bằng JMeter của công ty cho lễ hội "517" năm 2016). Chặn được các API mở có điều kiện query phức tạp trước khi lên production.
- Diễn tập lỗi ngẫu nhiên: bản đầu là mock server + gắn nhãn traffic để giả lập timeout, nghẽn. Sau đó xây Kennel theo mô hình Chaos Monkey (khoảng 10/2016): mất gói, tiêm lỗi vào interface, gỡ node, giết process.
- Phát hiện khi diễn tập (11/2016):
- giết node thì service registry không tự gỡ node đó;
- cân tải lệch, CPU một số máy quá cao; một node quá tải mà vẫn nhận traffic, vì ngắt mạch của SOA Python đặt ở phía server chứ không ở phía client;
- timeout sai khắp nơi: nhiều service chỉ đặt soft timeout (báo động mà không chặn) hoặc không đặt; hard timeout mặc định 20 giây;
- có kịch bản timeout vô hiệu, vì gửi qua message queue với Gevent không dùng đúng cơ chế timeout.
Bài học cho SWE
- Diễn tập lỗi tìm ra cấu hình timeout và cân tải sai mà review code không thấy. Cùng tinh thần Game Day của Quora và Chaos Monkey của Netflix (Sự cố và postmortem).
- Đầu tư công cụ test phải tính cả chi phí làm giao diện; phần "lõi" (CI chạy test hằng ngày) thường mang lại giá trị chính (Deploy và release an toàn).
Liên quan
Được nhắc tới trong
Chủ đề (2)
Công ty (1)
Bài tóm tắt (3)