#226 - Giải pháp Cache Invalidation tại Facebook
Chào các bạn độc giả của Grokking Newsletter.
Mời các bạn truy cập vào Grokking Knowledge Graph để đọc lại toàn bộ các bài viết của Grokking Newsletter nhé: https://knowledge.grokking.org/
Tại website này, chúng tôi đã tổng hợp toàn bộ 1000 bài viết của newsletter từ trước tới nay, ngoài ra các bài viết đều được phân loại, gán nhãn theo từng chủ đề quan trọng. Qua đó chúng tôi hy vọng các bạn có thể dễ dàng tìm kiếm được những bài viết mà mình quan tâm.
Mọi ý kiến đóng góp xin gửi về newsletter@grokking.org
Trong số này, chúng ta cùng tìm hiểu về:
Quá trình hợp nhất xử lý đăng ký và đăng nhập của Uber.
Chu kỳ phát triển phần mềm ở Netflix.
Giải pháp cache invalidation tại Facebook.
Ngoài ra các bạn vẫn có thể tiếp tục đặt mua ấn phẩm Dijkstra tập 2 tại đây nhé.
Những bài viết hay
USL - Uber’s Unified Signup and Login Stack
(by steven.do)
Gần đây, nhằm cải thiện trải nghiệm người dùng, Uber đã triển khai project USL (Unified Signup and Login), là một giải pháp để hợp nhất xử lý đăng ký và đăng nhập trên tất cả các ứng dụng và dịch vụ của Uber.
Cách xử lý cũ (tách biệt luồng xử lý đăng ký và đăng nhập) theo từng ứng dụng đã giúp Uber phát triển và cập nhật đổi mới nhanh chóng. Tuy nhiên, khi mở rộng quy mô hoạt động kinh doanh và phát triển thêm các ngành nghề kinh doanh phụ trợ, cách xử lý này dần phát sinh nhiều mâu thuẫn. Lúc này, mỗi sản phẩm lại có một entry point để xử lý đăng nhập và đăng ký riêng, khiến người dùng cuối phải chuyển đổi giữa hai tài khoản nếu như họ không rõ mình đã có tài khoản Uber trên sản phẩm đó hay chưa, và người dùng phải ghi nhớ thông tin của cả hai tài khoản với hai sản phẩm khác nhau, điều này khá bất tiện với người dùng cuối.
Trong bối cảnh đó, bài toán đặt ra cho các kỹ sư Uber là phải tạo ra một giải pháp mới để:
Đáp ứng được tính nhất quán (consistency) khi xử lý lượng đăng nhập và đăng ký lớn trên nhiều ứng dụng khác nhau.
Giảm chi phí triển khai lại luồng xử lý trên từng ứng dụng (duplication of effort).
Cải thiện thời gian áp dụng các thay đổi, như cập nhật chính sách bảo mật và các bản vá lỗi.
Giảm độ phức tạp về mặt kỹ thuật và giảm chi phí vận hành.
Sau khi triển khai giải pháp USL dưới dạng một single page web app có thể truy cập được trên cả desktop và mobile, Uber đã giải quyết được bài toán đặt ra ban đầu. Hơn thế nữa, USL đã mở ra một nền tảng “One Uber Identity” chung với trải nghiệm đăng nhập và đăng ký thống nhất trên tất cả các sản phẩm của Uber.
Đến nay, USL đã được áp dụng cho hơn 78% lưu lượng xử lý đăng ký và đăng nhập tại Uber.
Thông qua bài viết, các kỹ sư Uber sẽ giới thiệu về USL, các thách thức đặt ra về mặt công nghệ, chi tiết giải pháp kiến trúc và khả năng tối ưu hoá cho từng nghiệp vụ.
Full Cycle Developers at Netflix — Operate What You Build
(by nghialuu)
Năm 2012, việc vận hành một service quan trọng tại Netflix tốn rất nhiều tâm sức và tiềm ẩn nhiều vấn đề nhất định. Một dự án thường bao gồm các lập trình viên (LTV) làm việc cùng một team ops/SRE riêng biệt. Trong khi các LTV tập trung vào việc phát triển tính năng sản phẩm, thì team vận hành sẽ chịu trách nhiệm deploy, vận hành và support sản phẩm đó. Khi release một tính năng, các LTV cần thống nhất với team ops về các metrics, alerts, tài nguyên phần cứng. Dựa vào đó team ops sẽ deploy và vận hành ứng dụng. Khi mọi thứ diễn ra tốt đẹp, công việc của các LTV sẽ không bị gián đoạn. Ngược lại, khi có sự cố, hậu quả cộng dồn sẽ rất nhiều. Việc giao tiếp và chuyển giao kiến thức giữa các team lập trình và team ops gặp nhiều khó khăn do thiếu thông tin, cần thêm nhiều round trip qua lại để debug hoặc trả lời các câu hỏi từ đối tác. Các vấn đề liên quan tới deployment có thời gian phát hiện và giải quyết cao hơn bởi vì team ops không có kiến thức trực tiếp với code đang deploy. Khoảng cách giữa code-complete và deploy rất lâu, tính bằng tuần so với hiện nay là hằng ngày. Feedback từ hệ thống đến trực tiếp với ops rồi mới đến tay dev.
Để giải quyết việc này, Netflix đã phát triển một mô hình làm việc mà các lập trình viên sẽ chịu trách nhiệm toàn bộ vòng đời phát triển phần mềm: từ thiết kế, phát triển, test, deploy, điều hành và support. Model này được truyền cảm hứng từ các nguyên tắc devops đang dần trở nên phổ biến, giúp tối ưu thời gian từ phát triển đến deploy, và feedback ngược lại từ hệ thống đến trực tiếp dev, phá bỏ các rào cản ở giữa. Để cân bằng lượng công việc của dev, Netflix tạo ra các team tập trung hóa như Cloud Platform, Performance & Reliability Engineering, Engineering Tools, bao gồm các chuyên gia với những kiến thức chuyên sâu về deployment, infrastructure, alert, ... . Những chuyên gia đóng gói những hiểu biết của mình thành các tool và phát triển cơ sở hạ tầng chung, với nhiệm vụ tăng tốc năng suất và tự động hóa các công việc của LTV. Như vậy, LTV sẽ tối ưu hóa thời gian release tính năng mới và thử nghiệm, học hỏi và thích nghi trực tiếp từ nó, tự chủ xuyên suốt vòng đời phần mềm.
Model này được Netflix áp dụng cho đến ngày hôm nay, góp phần mở rộng đến 125 triệu user với hơn 140 triệu tiếng xem phim mỗi ngày. Bài viết có đề cập chi tiết hơn về model này, các trade off, và các yêu cầu cần thiết để áp dụng vào thực tế. Mời các bạn cùng tham khảo nhé.
Meta’s cache invalidation solution
(by nghialuu)
Cache giúp giảm độ trễ (latency), tăng khả năng đọc (read) của các hệ thống, và tiết kiệm chi phí. Chúng được sử dụng khắp mọi nơi, trên điện thoại hay trên trình duyệt của người dùng. Phil Karlton đã có câu nói nổi tiếng: "Chỉ có 2 thứ khó trong khoa học máy tính: vô hiệu hóa cache (cache invalidation) và cách đặt tên các thứ". Nếu bạn đã từng làm việc với cache invalidation, rất có thể bạn đã gặp nhiều vấn đề về sự thiếu nhất quán (inconsistency) của cache.
Đội ngũ Meta vận hành những hệ thống cache lớn nhất thế giới, bao gồm TAO và Memcache. Trong những năm qua, đội ngũ đã cải thiện tính nhất quán (consistency) của cache từ 99,9999% (6 chữ số) đến 99,99999999% (10 chữ số). Bài viết sau sẽ nói về giải pháp của Meta trong việc giải quyết vấn đề cache không nhất quán, với những nguyên tắc và phương pháp có thể áp dụng rộng rãi cho hầu hết cách dịch vụ cache ở bất cứ quy mô nào. Có thể tóm tắt cách làm của Meta như sau:
Cơ chế theo dõi và báo động khi cache mất nhất quán sau từng mốc thời gian, bằng service Polaris. Service này đóng vai trò như một client cuối, theo dõi, và khi nhận được một invalidation event, sẽ quét tất cả các cache. Nếu 1 cache trả về kết quả không nhất quán với dữ liệu invalidation, Polaris sẽ đánh dấu cache này là inconsistency, và sẽ check lại sau một khoảng thời gian. Polaris gửi report về cache inconsistency đó theo các mốc thời gian 1 phút, 5 phút, 10 phút.
Cơ chế tracing và logging. Việc log tất cả các thay đổi của một cache ở quy mô lớn là không thực tế, ví dụ như TAO với 10 nghìn tỉ cache-fill mỗi ngày. Thay vào đó, đội ngũ chỉ log những khoảng thời gian dễ dẫn đến vấn đề inconsistency này nhất.
Bài viết giải thích rất chi tiết về khái niệm, sự thử thách của bài toán cache inconsistency, phương thức của Meta, và một trường hợp áp dụng để fix bug thực tế. Mời các bạn tham khảo nhé.
Góc Lập Trình
Đề ra tuần này: Making File Names Unique
(by ndaadn)
Khi tạo một thư mục mới, nếu tên thư mục trùng với tên thư mục hiện có, hệ thống sẽ tự động đổi tên thư mục thành dạng <tên thư mục>(số thứ tự tiếp theo).
Ví dụ:
Thư mục hiện có: “gta”
Thư mục được tạo: “gta” -> hệ thống sẽ tự đổi tên thư mục mới thành “gta(1)”
Đề bài cho một mảng, mỗi phần tử là tên một thư mục sẽ được tạo lần lượt từ trái sang phải. Yêu cầu trả về mảng kết quả bao gồm tên các thư mục sau khi hệ thống đã xử lý đổi tên.
Ví dụ:
- input: names = ["gta","gta(1)","gta","avalon"]
- output: names = ["gta","gta(1)","gta(2)","avalon"]
Lời giải đề bài tuần trước: Verify Preorder Serialization of a Binary Tree
(by ndaadn)
Giả sử mỗi một nút trong cây ứng với một “chỗ trống”, ta có quan sát như sau:
Mỗi nút không phải là nút rỗng sẽ chiếm 1 chỗ trống và cung cấp 2 chỗ trống (ứng với 2 nút lá).
Mỗi nút lá sẽ chiếm một chỗ trống và không cung cấp chỗ trống nào.
Từ mảng đã cho trước, ta chỉ cần xây dựng bằng cách duyệt từ trái sang phải và ứng với mỗi phần tử, kiểm tra số chỗ trống còn lại có đủ để thực hiện xây dựng cây cho phần tử tiếp theo hay không.
Thuật toán như sau, thực hiện duyệt mảng đầu vào từ trái sang phải:
Trường hợp nếu gặp một số, ta tăng số chỗ trống lên 2 vì nó cung cấp 2 vị trí cho 2 nút lá, đồng thời giảm số chỗ trống đi 1 vì chính nút này chiếm 1 chỗ trống trong cây.
Trường hợp nếu gặp kí tự “#”, tức là nút lá, ta giảm số chỗ trống đi 1.
Nếu mảng đã cho là một cây nhị phân theo thứ tự preorder, thì chỉ sau khi duyệt toàn bộ mảng, số chỗ trống sẽ bằng 0.
Thuật toán có độ phức tạp thời gian O(N), độ phức tạp không gian O(1).
Mời các bạn tham khảo cài đặt sau: https://pastebin.com/A0qGJR1m
Code & Tools
free-for.dev - Thời nay có một lượng khổng lồ các dịch vụ OpenSource hoặc free dành cho lập trình viên, nhưng không dễ để tìm thấy chúng. free-for.dev giúp chọn lọc và cung cấp danh sách các phần mềm (SaaS, PaaS, IaaS, ...) có free tier cho bạn
Miro - Một ứng dụng bảng trắng ảo cho phép nhóm của bạn có thể thảo luận, chia sẻ và lên ý tưởng một cách trực tuyến
Feedback
Bạn đánh giá nội dung số newsletter này thế nào?
(1 = Rất tệ / 5 = Rất tốt)
(Việc đánh giá của các bạn là rất quan trọng, sẽ giúp chúng tôi liên tục cải thiện nội dung newsletter tốt hơn)
Grokking mang lại cho các bạn những kiến thức mới mẻ và hữu ích thông qua:
Tech Talk: Là một hoạt động thường xuyên của Grokking từ những ngày đầu thành lập. Tại đây các diễn giả chia sẻ kiến thức xoay quanh Computer Science và Software Engineer. Các buổi Tech Talk đều được record và upload lên kênh youtube của Grokking.
Grokking Knowledge Graph: Tập hợp những nguồn kiến thức phong phú với hơn 1000 bài viết chọn lọc, các đầu sách, khóa học, v.v... Các bài viết đều được gán nhãn để giúp bạn đọc dễ dàng tìm kiếm.
Webinar: Là chương trình kết nối các kỹ sư Việt Nam và các kỹ sư đang làm việc tại các công ty công nghệ hàng đầu thế giới.
Dijkstra: Một ấn phẩm được xuất bản bởi các thành viên của Grokking. Với những bài viết đào sâu vào kỹ thuật và kiến thức khoa học máy tính.
Kipalog: Nền tảng chia sẻ kiến thức dành cho các lập trình viên.
Newsletter: Những bài viết hay về công nghệ sẽ được gửi tới bạn hàng tuần qua email.
Chúc các bạn sẽ tìm được nhiều điều mới mẻ khi đến với Grokking và xin hẹn gặp lại các bạn vào tuần sau.
Quotes
Punishments include such things as flashbacks, flooding of unbearable emotions, painful body memories, flooding of memories in which the survivor perpetrated against others, self-harm, and suicide attempts.
―Alison Miller, Healing the Unimaginable: Treating Ritual Abuse and Mind Control