Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Kiến trúc FAANG 7 - Meta developer workflow

 Meta's developer workflow

Source version control
Developer ngồi code thì đã quá quen thuộc với các tool source version control như Github, SVN, Bitbucket, gọi là public source control system. Thực tế với những hệ thống cỡ vừa source code tầm vài trăm K, vài nghìn repos thì xài Github, Bitbucket là quá đủ rồi, dùng ngon trong tầm giá. Nhưng đối với big tech cỡ như Google, Meta thì lại là câu chuyện khác
Kiến trúc của Meta trong giai đoạn đầu tiên là Monolithic, main source repos khoảng 17 triệu LOC và tầm 44K files vào năm 2013. Meta không muốn tách nhỏ main repos này vì sẽ mất đi khả năng “monolithic” của hệ thống, kết cục thì repos này ngày càng phình to ra, đến nay thì con số đó lên tới cả triệu, số lượng commit cũng tới hàng triệu, số repos tầm vài trăm nghìn.
Và lúc này thì source version control truyền thống như Git gặp issue về bottle neck, scability. Do đó kỹ sư của Meta đã phát triển một hệ thống source version control mới có khả năng scale và đáp ứng được lượng lớn commit, files như trên, gọi là Sapling

Sapling Meta
Sapling hoàn toàn tương thích với Git cho nên developer làm việc trên git nhiều thì việc sử dụng Sapling rất đơn giản vì các command, gitflow là không thay đổi, từ commit, log, diff, rebase…
Thanh niên có thể download và cài đặt Sapling ở đây https://sapling-scm.com/docs/introduction/
Và đây là bảng so sánh giữ Git và Sapling command. Tóm lại là khá giống nhau
Một tính năng khá hay của Sapling đó là smartlog.
Đầu tiên cần biết chức năng log của git thông thường
Khi git logs, nó sẽ liệt kê tất cả những commit, ai push code, ngày giờ, file nào thay đổi…
Git Log - javatpoint
Tóm lại có những thanh niên nào commit code là nó liệt kê ra hết, theo kiểu tả pí lù, có những commit không liên quan đến phần của bạn nó cũng phọt ra. Tưởng tượng một repos mà có cả triệu commit mà list hết ra ngồi đọc chắc là ngất trên cành quất
Còn Sapling có chức năng SmartLog, nó sẽ ẩn hết commit history không liên quan
Ví dụ, bạn sửa 1 file abc.py thì Sapling sẽ show những commit history có liên quan đến file đó.
Thật ra bây giờ, nếu xài VSCODE thì cũng có nhiều plugin bổ trợ cho Git như như Git lens, graph… cũng khá ổn.
Nhưng thế mạnh thực sự của Sapling là khả năng scale, giúp cho nó có thể xử lý được những hệ thống repos lớn hàng triệu LOC, commit

Buck2: Build system

Code commit lên repos rồi thì đến giai đoạn build code, code của Meta cũng được viết bằng nhiều loại ngôn ngữ khác nhau như C++, Python, Rust, Kotlin, Swift, Objective-C, Haskell, OCaml. Với hàng triệu repos và nhiều ngôn ngữ thì việc build code bằng công cụ truyền thống như Make, gradle không chịu nổi nhiệt, Meta tự phát triển hệ thống build riêng gọi là Buck2, Google cũng có hệ thống build tương tự gọi là Bazel

Buck2 là platform dùng để build source do facebook phát triển
Buck2

Bulk2 có tính năng build parrallel để tăng tốc độ build và khả năng share compilation giữa các developer. Ví dụ nhưng 2 ông dev cũng build 1 module source code nào đó, nếu ông A mà build thành công module đó rồi thì share compilation lại cho ông B, rồi ô B chỉ cần build chỗ thay đổi, tiết kiệm được thời gian build
justifyContent
Đọc architect kiểu này thì dễ bị ngáo đá, nên giaosucan’s blog giải thích thật đơn giản thế này
Meta có hàng loạt các build server, Buck2 cho phép developer send command build tới các server này để build, gọi là remote execution, cho phép hàng loạt server build song song để speed up quá trình build. Trong 1 single build, Buck2 có thể build được nhiều ngôn ngữ khác nhau gọi là Multi-language composability dựa vào Build rule . Ví dụ như như build Android thì dùng rule android_library, build C++ thì dùng rule [c++], c(https://buck.build/rule/cxx_binary.html). Tóm lại ngôn ngữ thông dụng là đều có rule build hết ngon lành cành đào
Thường thì khi build code hay dính mấy cái dependency thư viện, mấy cái thư viện độc lập thì sẽ được build parallel để tăng tốc độ build
Chrome Tracing Sample
Tất cả các chức năng trên được thực hiện bởi Bulk2 Daemon, một process chạy ngầm.

## Infer: Testing

Static analysis code Meta không xài tool truyền thống như SonarQuebe hay Snyk mà họ vẫn làm theo truyền thống của Big Tech, tự phát triển hàng của riêng mình
Infer , static analysis tool for Java, C++, Objective-C

./Root/Hello.java:37: error: RESOURCE_LEAK resource of type java.io.FileOutputStream acquired to stream by call to allocateResource() at line 31 is not released after line 37 35. 36. try { 37. > stream.write(12); 38. } finally { 39. // FIXME: should close the stream 40. ./Root/Hello.java:59: error: RESOURCE_LEAK resource of type java.io.FileOutputStream acquired to fos by call to FileOutputStream(...) at line 53 is not released after line 59 57. if (fos != null) { fos.close(); } 58. } 59. > } 60. 61. public static void main(String[] args) { 62.

Ngoài ra, thì xài thêm tool RacerD, tool detect Java Conccurrency Bug , do Meta đang chuyển dần code Java của họ từ Single Thread sang Multi-thread nên cần xài thêm tool này , gọi là Thread safety analysis.
Chi tiết về cơ chế Đa Luồng của Meta sẽ có bài viết cụ thể sau
Và cuối cùng là Automation Test. Một lần nữa mất tool truyền thống như JMeter, Seleneium cũng không xài (có lẽ mấy tool này chịu không nổi nhiệt)
Jest is a delightful JavaScript Testing Framework with a focus on simplicity. https://jestjs.io/ chạy tốt với Node, React, Angular
Tool này được tạo từ 2011, khi Facebook viết lại module messager bằng Javascript sau đó được open source thành OpenJS framework. Sau này Google, Amazon , Stripe cũng dùng framework này để viết performance test.
Trên đây là một vài platform mà Meta sử dụng cho Developer workflow của họ, bài tiếp theo sẽ đi sâu hơn vào từng step trong workflow của Meta

Đăng nhận xét

0 Nhận xét