An Article to Learn About ByteDance Microservices Middleware CloudWeGo

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

Nguồn thứ cấp: bài phỏng vấn các chuyên gia CloudWeGo của ByteDance trên InfoQ, đăng lại trên blog dự án; phần lớn là giới thiệu dự án mã nguồn mở. Bài tiếp về hiệu năng: ByteDance 2024.

Mốc tiến hoá

  • 2014: ByteDance đưa Go vào để giải bài toán đồng thời cao của push service giữ kết nối lâu.
  • 2016: framework RPC Kite viết bằng Go, và Ginex (bọc mỏng Gin) cho HTTP. Theo lời trưởng nhóm framework tại QCon 2021, hai framework này thúc đẩy Go lan rộng trong công ty.
  • Nửa sau 2019: Kite gắn chặt với Thrift nên khó đổi mô hình mạng hay codec; thêm tính năng liên tục làm code phình và tắc. Bắt đầu thiết kế lại framework RPC, đồng thời tự viết thư viện mạng Netpoll (đa hợp kết nối, biết trạng thái kết nối).
  • 10/2020: Kitex (viết lại Kite, xoay quanh hiệu năng và khả năng mở rộng) ra dùng nội bộ. Tới 9/2021 có hơn 30.000 microservice chạy Kitex, đa số giảm CPU và latency sau khi chuyển.
  • 8/9/2021: mở mã nguồn CloudWeGo (Kitex, Netpoll, Thriftgo, netpoll-http2); về sau thêm Hertz (HTTP) và ShmIPC.

Cách tổ chức code nội bộ và mã nguồn mở

  • Nguyên tắc một bộ code cho cả trong và ngoài: dự án không dính hệ sinh thái nội bộ thì chuyển thẳng ra ngoài; Kitex thì tách lõi ra thư viện mở, bên trong bọc một lớp vỏ để cập nhật trong suốt với user, các module nối vào hệ governance nội bộ (registry, config center, monitoring) để lại làm extension (Byted Suite).
  • Service mesh nội bộ đã triển khai rộng: Kitex nhận biết chế độ mesh thì gỡ các thành phần governance của mình và để mesh làm; nói chuyện với sidecar qua ShmIPC (bộ nhớ chia sẻ) thay vì mạng.
  • Tự nhận giới hạn: governance chưa phong phú bằng vài framework mở khác; phía client chưa nhanh bằng phía server; một số benchmark bên ngoài thấy Kitex "bình thường" vì kịch bản không khớp. Cộng đồng đòi Protobuf nên sẽ tối ưu cho Protobuf.

Vì sao

  • Theo ByteDance, phần lớn framework Go phổ biến không hỗ trợ Thrift (giao thức nội bộ chính), và quy mô cần tối ưu sâu cả chuỗi gọi; framework cũ thì không đổi nổi tầng mạng và codec.

Bài học cho SWE

Liên quan