Trả lời nhanh: Turborepo giải quyết đúng một vấn đề của monorepo: chạy lại toàn bộ trong khi chỉ một gói thay đổi. Nó tính một mã băm từ nội dung đầu vào của mỗi tác vụ, và nếu mã đó đã có kết quả trong bộ nhớ đệm thì nó lấy ra thay vì chạy lại. Với repo mười gói mà bạn chỉ sửa một, thời gian chờ giảm rất mạnh. Điều kiện để nó hoạt động đúng: khai báo chính xác đầu vào và đầu ra của từng tác vụ.
Repo chứa nhiều gói thì thuận tiện cho việc dùng chung mã nguồn, nhưng phiền ở chỗ mỗi lần chạy kiểm thử lại đụng tới tất cả. Công cụ điều phối giải quyết chuyện đó bằng cách nhớ những việc đã làm. Bài này nói cách khai báo cho đúng và những chỗ hay sai.
Nguyên lý: mã băm và bộ nhớ đệm
Mỗi lần chạy một tác vụ, công cụ tính mã băm từ: nội dung file nguồn của gói, các gói mà nó phụ thuộc, biến môi trường liên quan, và chính cấu hình tác vụ. Nếu mã băm đó đã có kết quả lưu, nó lấy kết quả ra thay vì chạy.
Vì vậy trong repo mười gói, sửa một gói lá thì chỉ gói đó và những gói phụ thuộc vào nó phải chạy lại. Bảy tám gói còn lại lấy từ bộ nhớ đệm gần như tức thì.
Điều này chỉ đúng khi khai báo chính xác. Khai thiếu đầu vào thì công cụ lấy kết quả cũ trong khi đáng lẽ phải chạy lại, và đó là loại lỗi rất khó lần ra vì mọi thứ trông như đang chạy tốt.
Khai báo tác vụ và phụ thuộc
{ "tasks": { "bien-dich": { "dependsOn": ["^bien-dich"], "outputs": ["dist/**"] }, "test": { "dependsOn": ["bien-dich"], "outputs": ["coverage/**"] }, "lint": {}, "dev": { "cache": false, "persistent": true } }}Ba điểm cần hiểu:
- Dấu mũ trong tên phụ thuộc nghĩa là chạy tác vụ đó ở các gói mà gói này phụ thuộc vào, trước khi chạy ở chính nó.
- Khai báo đầu ra để công cụ biết thư mục nào cần lưu vào bộ nhớ đệm. Khai thiếu thì lần sau nó khớp được mã băm nhưng không có kết quả để khôi phục.
- Tác vụ chạy dài như máy chủ phát triển phải tắt bộ nhớ đệm và đánh dấu là chạy liên tục, nếu không công cụ sẽ chờ nó kết thúc mãi mãi.
Chia sẻ bộ nhớ đệm cho cả đội
Đây là phần tiết kiệm nhiều nhất mà nhiều đội chưa bật. Khi một người đã chạy xong một phiên bản, những người khác và cả máy CI lấy lại kết quả đó thay vì làm lại.
Hai lựa chọn: dùng dịch vụ lưu trữ sẵn có, hoặc tự dựng một máy chủ lưu trữ trong mạng nội bộ. Với đội ở Việt Nam, tự dựng trên chính VPS của công ty thường nhanh hơn vì dữ liệu không phải đi ra quốc tế.
Trên máy CI, hãy giữ luôn cả thư mục bộ nhớ đệm cục bộ giữa các lượt chạy, theo cách bố trí trong bài về cache dùng chung. Hai lớp này bổ sung nhau: lớp cục bộ nhanh nhất, lớp chia sẻ giúp máy mới hoặc người mới không phải làm lại từ đầu.
Ba bẫy hay gặp
Quên khai file cấu hình dùng chung. Sửa một file cấu hình ở gốc repo mà nó không nằm trong danh sách đầu vào thì công cụ vẫn lấy kết quả cũ. Đây là bẫy nguy hiểm nhất vì kết quả sai mà không có báo lỗi.
Biến môi trường không khai báo. Tương tự: đổi biến môi trường mà không khai thì kết quả cũ vẫn được dùng, và bạn triển khai một bản với cấu hình sai.
Tác vụ có kết quả không xác định. Nếu tác vụ sinh ra file chứa thời điểm chạy hoặc số ngẫu nhiên, mỗi lần ra kết quả khác nhau và bộ nhớ đệm trở nên vô nghĩa. Hãy tách phần đó ra bước riêng ở cuối.
Cách kiểm chứng nhanh: chạy hai lần liên tiếp mà không đổi gì. Lần hai phải gần như tức thì. Nếu không, một trong ba bẫy trên đang xảy ra.
Khi nào đáng dùng
Đáng khi: repo có từ ba gói trở lên; các gói phụ thuộc lẫn nhau; hoặc thời gian chạy toàn bộ kiểm thử đã vượt vài phút.
Chưa cần khi: repo chỉ có một hai gói; hoặc các gói hoàn toàn độc lập và bạn hiếm khi chạy tất cả cùng lúc.
Về việc có nên gộp thành monorepo hay không, đó là câu hỏi khác và có bài riêng trong cụm này. Công cụ điều phối chỉ giải quyết phần chi phí kỹ thuật của monorepo, nó không làm cho quyết định gộp trở nên đúng đắn nếu các dự án của bạn vốn không liên quan tới nhau.
Cuối cùng, nhớ rằng bộ nhớ đệm chiếm dung lượng và phình theo thời gian, nên đặt lịch dọn theo bài dọn rác trên ổ đĩa.
Điều kiện để bộ nhớ đệm thực sự hoạt động
| Điều kiện | Sai thì hậu quả |
|---|---|
| Khai báo đủ đầu vào của mỗi tác vụ | Thiếu một tệp đầu vào thì công cụ dùng lại kết quả cũ dù mã đã đổi |
| Khai báo đủ đầu ra của mỗi tác vụ | Thiếu thư mục đầu ra thì lần dùng lại sẽ không có tệp, bản dựng hỏng |
| Biến môi trường ảnh hưởng kết quả phải được liệt kê | Bản dựng cho môi trường thật lại nhận kết quả của môi trường thử |
| Cùng phiên bản công cụ giữa các máy | Mã băm khác nhau nên không máy nào dùng được kết quả của máy nào |
Ba dòng đầu là nguyên nhân của gần như mọi trường hợp bản dựng sai một cách khó hiểu. Khi nghi ngờ, chạy lại với chế độ bỏ qua bộ nhớ đệm, nếu kết quả khác đi thì khai báo đầu vào đang thiếu.
Kiểm chứng bộ nhớ đệm có ăn hay không
# Chay lan mot, ghi lai thoi giannpx turbo run build # Chay lai NGAY, khong sua ginpx turbo run build# Ky vong: gan nhu tuc thi, bao la dung lai ket qua cu# Neu van chay lai tu dau thi khai bao dau vao dang thua thu gi do# thay doi moi lan chay, vi du dau thoi gian hoac so ngau nhien # Kiem tra phan xu ly dung khi ma doi:# sua mot dong trong mot goi con roi chay lai# chi goi do va cac goi phu thuoc vao no duoc chay lai # Xoa bo nho dem khi can so lai tu daunpx turbo run build --forceChia sẻ bộ nhớ đệm cho cả đội, cần cân nhắc gì
- Kết quả dựng là tài sản của dự án. Nơi lưu chung phải được kiểm soát quyền truy cập như kho mã, không đặt ở nơi ai cũng ghi được.
- Ghi thì phải hạn chế, đọc thì mở rộng. Máy chủ tích hợp liên tục được ghi, máy cá nhân chỉ nên đọc. Ngược lại là mở đường cho một máy nhiễm bẩn làm hỏng bản dựng của cả đội.
- Nếu dự án có ràng buộc về nơi lưu dữ liệu, hãy đặt nơi lưu chung trên hạ tầng bạn kiểm soát thay vì dịch vụ ngoài.
Câu hỏi thường gặp
Vì sao chạy lần hai vẫn lâu?
Vì bộ nhớ đệm không dùng được. Ba nguyên nhân: chưa khai báo đầu ra nên không có gì để khôi phục, thiếu khai báo đầu vào nên mã băm đổi mỗi lần, hoặc tác vụ sinh ra kết quả khác nhau ở mỗi lượt chạy.
Bộ nhớ đệm chia sẻ có an toàn không?
An toàn nếu bạn tự dựng trong mạng nội bộ hoặc dùng dịch vụ có kiểm soát truy cập. Lưu ý là kết quả có thể chứa thông tin từ biến môi trường, nên đừng để bộ nhớ đệm ở nơi ai cũng đọc được.
Repo bao nhiêu gói thì đáng dùng?
Từ ba gói trở lên và có phụ thuộc lẫn nhau. Dưới mức đó thì cấu hình thêm một công cụ không bù lại được thời gian tiết kiệm.
Máy chủ nào để đặt bộ nhớ đệm chia sẻ?
Một VPS trong mạng nội bộ của công ty là đủ, và với đội ở Việt Nam thì nhanh hơn dịch vụ quốc tế vì dữ liệu không phải đi xa. Cần dung lượng rộng và ổ đĩa nhanh vì đây là nhiều file nhỏ.
