Kitex: Unifying Open Source Practice for a High-Performance RPC Framework

Bài tóm tắt ByteDance 2022 3. Quy mô lớn Độ khó: Trung bình

ByteDance · 2022 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bài tổng kết một năm mở mã Kitex. Đọc cùng ByteDance 2022 (bức tranh CloudWeGo) và ByteDance 2024 (tối ưu hiệu năng về sau).

Bối cảnh

  • Lịch sử: ByteDance bắt đầu dùng Go năm 2014; năm 2015 dựng service nội bộ với Thrift cho RPC; 2016 ra framework RPC Go đầu tiên Kite, làm nhanh cho giai đoạn tăng trưởng, ít tính trước. Nhu cầu phức tạp dần và số service, số lời gọi tăng mỗi năm, Kite không theo kịp; năm 2019 bắt đầu viết Kitex, bản chính thức đầu 2020, tới cuối 2020 hơn 10.000 service nội bộ đã dùng. Theo ByteDance, Go là ngôn ngữ chính cho nghiệp vụ từ 2014 đến 2020, với hàng chục nghìn microservice.

Thay đổi chính

  • Một codebase cho nội bộ và bên ngoài: chia Kitex thành Kitex Core (cấu trúc tầng, giao diện, cài đặt mặc định), Kitex Tool (sinh code từ IDL, tách các thư viện như Thriftgo, Fastpb), và Kitex Byted (extension nối với hạ tầng nội bộ: đăng ký dịch vụ, cấu hình, giám sát, tracing). Mở mã Core và Tool; extension nội bộ ở lại kho nội bộ, kèm một lớp vỏ để người dùng nội bộ nâng cấp không bị ảnh hưởng.
  • Trình tự mở mã: 2/2021 bắt đầu chuẩn bị; các thư viện nền Kitex phụ thuộc phải mở trước (bytedance/gopkg); 7/2021 mở mã và bản nội bộ chuyển sang dùng thư viện open source, nhưng chưa thông báo cho tới khi xác nhận ổn định với lượng lớn service nội bộ.
  • Nhu cầu bên ngoài khác nhu cầu nội bộ: người ngoài dùng Protobuf/gRPC nhiều hơn Thrift, nên họ viết lại code sinh cho Protobuf (Fastpb: ghi nhanh hơn khoảng 68%, ít cấp phát hơn khoảng 84% so với thư viện chính thức, theo họ) và tối ưu đường gRPC (trước đó ít dùng nội bộ, ở concurrency thấp còn thua gRPC chính thức). Thêm proxyless xDS để nối thẳng Istio, không cần Envoy sidecar; generic call JSON/Protobuf cho gateway (thực hiện ở phía gọi để không bắt mọi ngôn ngữ phía server phải hỗ trợ); retry theo kết quả và theo từng method; validator theo annotation trong IDL; Frugal, codec Thrift dùng JIT, không cần sinh code codec (IDL phức tạp sinh hàng chục nghìn dòng).

Vì sao

Bài học cho SWE

  • Thiết kế framework nội bộ với lõi + extension từ đầu nếu có ý định dùng nó ở nơi khác.
  • Khi mở mã, cho hệ nội bộ dùng bản open source trước, thông báo sau.
  • Người dùng mới mang tới yêu cầu khác (Protobuf, Istio) làm lộ những đường ít được tối ưu.

Liên quan