Managing Software Dependency at Scale
Bài tóm tắt LinkedIn 2018 3. Quy mô lớn Độ khó: Trung bình
LinkedIn · 2018 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- LinkedIn có hơn 10.000 codebase (multiproduct), mỗi cái một repo, phụ thuộc nhau qua artifact nhị phân (Gradle/Maven) chứ không qua mã nguồn mới nhất. Sửa một product phải biết không làm hỏng product phụ thuộc (dependency testing).
- Câu hỏi Gradle không trả lời được: gỡ artifact hết hạn khỏi Artifactory thì ảnh hưởng ai, sau một commit nên chạy dependency test nào, bản deploy chứa version nào của module, ai còn dùng thư viện có bug nghiêm trọng.
- Hệ cũ dựng trên graph database thương mại, ghi phụ thuộc ở mức product, không phản ánh việc Gradle giải xung đột version ở mức module, chủ yếu cho Java. Hậu quả: báo nhầm phụ thuộc vòng, cảnh báo nhầm dùng thư viện hết hạn, test framework bị ép nâng version.
Thay đổi chính
- Service mới: đồ thị đã giải xong ở mức module và configuration (theo Ivy), lấy từ chính Gradle (tính cả quy tắc thay thế riêng của LinkedIn), nhập được đồ thị từ công cụ khác (CocoaPods, npm/Yarn), phân biệt phụ thuộc build, test, runtime; API Rest.li.
- Bỏ graph DB, chuyển sang Espresso: đồ thị của một product ở một version, khi đã tạo, là bất biến, nên không cần duyệt cạnh realtime; Neo4j không chịu nổi quy mô, MongoDB/Cassandra tốn công onboard và vận hành. Đồ thị được tính sẵn (cả chiều ngược) và lưu vào bốn bảng có khoá chính/phụ thiết kế để tra nhanh và chia đều partition.
- Quy mô: 1,3 tỷ node, 4,8 tỷ cạnh, 5 TB; đồ thị lớn tới 800 node, 4.500 cạnh.
- Nhập gần realtime: Artifactory phát event khi publish → listener → importer dựng đồ thị và ghi Espresso; một scheduler quét định kỳ bắt artifact bị sót. CI/CD chạy 20.000–30.000 job/ngày.
- Kết quả: 12 API server, hơn 30 importer ở bốn region, tới 1 triệu query/ngày; báo nhầm phụ thuộc vòng giảm 60%.
Vì sao
- Dữ liệu sai làm công cụ phía sau phải bảo thủ hoặc báo sai; dữ liệu đúng ở mức module mở ra các tính năng mới (UI xem đồ thị, dependency test mịn hơn, tự cập nhật phụ thuộc).
Bài học cho SWE
- Dữ liệu có dạng đồ thị chưa chắc cần graph DB: nếu đồ thị bất biến và query biết trước, tính sẵn rồi lưu vào kho document/key-value.
- Lấy dữ liệu từ chính công cụ build để khớp với cách nó giải xung đột, thay vì tự tính lại.
Liên quan
- LinkedIn 2020 (CI với hơn 10.000 repo) · LinkedIn 2015
- CI và build ở quy mô lớn · Chọn database theo workload
#Multiproduct#binary dependency#dependency testing#Gradle#Ivy#Artifactory#graph database → Espresso#precomputed resolved graph#module-level graph#Kafka import events#CI/CD
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (2)