Getting from tested to battle-tested

Bài tóm tắt Jane Street 2025 3. Quy mô lớn Độ khó: Khó

Jane Street · 2025 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Lưu ý: Jane Street là khách hàng và đồng thời dẫn vòng gọi vốn tiếp theo của Antithesis (bài nói rõ). Nhận định về công cụ ghi "theo Jane Street".

Bối cảnh

  • Aria là message bus nội bộ độ trễ thấp, có thứ tự chặt và bảo đảm tin cậy, làm nền cho các team khác dựng hệ chịu lỗi (xem index của Aria ở Jane Street 2026). Càng nhiều team dùng, mỗi tuần không sự cố càng thành nghĩa vụ, trong khi hệ vẫn phải lớn và phức tạp thêm.
  • Bộ test đã có, lớn dần một cách tự nhiên: unit test; integration test trên lớp mạng mô phỏng (trễ, rơi gói, điều khiển thời gian); quickcheck sinh thứ tự sự kiện ngẫu nhiên; version skew test giữa client mới và server cũ và ngược lại; fuzz bằng AFL biến byte thành chuỗi cập nhật trạng thái; lab test hiệu năng hằng đêm; chaos test ở staging (tải giả, restart ngẫu nhiên).
  • Theo tác giả, mạng mô phỏng là phần quý nhất: test nhanh, tất định, ít mock, chạy hết trong mỗi build mà không flaky. Sự cố production hiếm dù deploy hằng tuần. Nhưng bug lọt qua luôn là kiểu "khó thế thì chẳng ai nghĩ ra để test".

Thay đổi chính

  • Đầu 2025 thêm Antithesis: chạy cả hệ trong VM dưới một hypervisor tất định, tự chen lỗi vào lịch chạy và mạng, khám phá trạng thái theo phản hồi coverage, và tua lại được một thời điểm trước lỗi để thử nhánh khác.
  • Giao diện: Docker image + file compose mô tả hệ; một thư mục chứa các file thực thi, mỗi file là một hành động người dùng/admin. Không phải sửa hệ, chạy client thật, filesystem và shared memory thật.
  • Lần chạy thử đầu tiên tìm ra hai bug chưa biết, một bug mới đưa vào một tháng trước và có khả năng xảy ra ở production với hậu quả nặng.
  • Chạy mỗi đêm trên revision mới nhất. Một bug cụ thể: service "tip-retransmitter" (phục vụ dữ liệu gần nhất từ ring buffer trong RAM) vừa được mở rộng để phục vụ client ở vùng khác. Sau khi restart từ snapshot và trước khi ring buffer đầy, nếu client hỏi offset trước snapshot thì server trả về byte NUL từ vùng trống thay vì lỗi, tức dữ liệu hỏng.
  • Bug đã nằm sẵn từ khi có snapshot nhưng bị che: client cùng vùng dùng cơ chế service discovery khác nên không bao giờ hỏi server khởi động từ snapshot muộn hơn; client vùng khác thì cứ thử.
  • Gỡ bằng debugger của Antithesis: tua lại 1 giây trước crash, chạy tcpdump trong VM, đọc offset yêu cầu (313425) và offset snapshot (315567) bằng chính lệnh admin của Aria.

Vì sao

  • Test viết tay, kể cả quickcheck và fuzz, bị giới hạn trong môi trường nhân tạo người viết dựng ra; chaos test thì "mới chạm bề mặt" không gian trạng thái.
  • Theo tác giả, có Antithesis team dám nhận dự án tham vọng hơn. Bước tiếp: một object store phân tán đang phát triển, các hệ không có lớp mạng/thời gian mock được (dùng phần mềm bên ngoài), và làm nguồn phản hồi cho coding agent.

Bài học cho SWE

  • Mô phỏng tất định trong process (lớp mạng giả) và mô phỏng cả hệ dưới hypervisor bổ sung cho nhau: cái đầu rẻ, chạy mỗi build; cái sau tìm tổ hợp không ai nghĩ tới.
  • Tái dùng code cũ cho ngữ cảnh mới (phục vụ vùng khác) làm lộ giả định ngầm mà cơ chế khác (service discovery) từng che. Đổi đường gọi là phải test lại giả định.
  • Chạy hằng đêm với revision mới nhất giúp khoanh bug vào thay đổi gần đây.

Liên quan