#229 - Hệ thống authorization ở Netflix
Trong số này, chúng ta cùng tìm hiểu về:
Cách DoorDash modularize dịch vụ xếp hạng
Hệ thống authorization ở Netflix
Lời giải bài Possible Bipartition
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
Leveraging the Pipeline Design Pattern to Modularize Recommendation Services
Các công ty công nghệ như DoorDash, Amazon hay Netflix thường thu hút người dùng bằng cách mang đến những trang chứa nội dung phong phú để tăng trải nghiệm cũng như truyền cảm hứng mua sắm.
Tại DoorDash, những trang khám phá nội dung sẽ hiển thị kết hợp thông tin của các nhà hàng và mặt hàng thực phẩm được đề xuất cho từng người dùng dựa trên vị trí và lịch sử tương tác trước đây của họ. Đội ngũ của DoorDash xây dựng một microservice được gọi là Feed Service đóng vai trò đầu vào cho việc nhập yêu cầu của người dùng, sau đó sắp xếp dữ liệu từ các nguồn providers, context và xây dựng các module hiển thị tương ứng trước khi trả về phía client. Tuy nhiên, Feed Service trước đây gặp một vài hạn chế trong việc mở rộng hệ thống:
Trùng lặp việc đi lấy dữ liệu từ các hệ thống khác.
Giới hạn trong việc sắp xếp nội dung và đánh thứ tự giữa các cụm carousels: việc xếp hạng nội dung của Search Service sẽ phụ thuộc vào tập dữ liệu nhà hàng đã được truy xuất từ Feed Service gây ra những hạn chế trong việc mở rộng hệ thống.
Đội ngũ kỹ sư đã giải quyết vấn đề trên bằng cách sử dụng Workflow (core thực thi do chính team DoorDash phát triển) để điều phối các luồng và các quy trình dựa vào đồ thị định hướng không tuần hoàn (DAG) và chạy các jobs tương ứng, mỗi job được tập hợp thành một cụm có cùng chức năng. Với cách tiếp cận mới, quá trình tạo ra nội dung cho các trang khám phá được chia nhỏ thành các jobs:
Truy xuất dữ liệu: tìm kiếm và nạp nội dung từ các providers, nạp một lần để tránh các lệnh gọi bị trùng lặp.
Gom nhóm nội dung: nhóm các nội dung tương ứng thành các tập collections để tối ưu cho việc xếp hạng và hiển thị.
Xếp hạng: xếp hạng dựa trên từng tập collection.
Với cách tiếp cận xây dựng một pipeline như trên, DoorDash đã module hóa các quy trình để thuận tiện cho việc mở rộng. Sau khi truy xuất tập hợp các cửa hàng, nhà hàng từ các providers hoàn tất sẽ được chuyển giao cho các module khác như module xếp hạng (ranking), ... để hiển thị lên trang khám phá cho người dùng. Với cách triển khai module ranking ngay trong Feed Service sẽ mang đến những ưu điểm như cho phép triển khai các tính năng phức tạp một cách độc lập, hạn chế tính phụ thuộc cũng như giúp cho giảm thông lượng khi gọi đến Search Service.
Để tìm hiểu chi tiết hơn về giải pháp, mời bạn đọc cùng tham khảo bài viết.
Authorization at Netflix Scale
(by n^4)
Đối với các hệ thống Web ngày nay, authentication và authorization được xem là 2 bài toán phổ biến hầu như không thể thiếu đối với các hệ thống web. Theo hướng tiếp cận thông thường đối với đa phần hệ thống web, người dùng tiến hành đăng nhập (authentication) và hệ thống sẽ áp dụng các logic xử lý dựa trên quyền hạn ứng với từng user, theo đó ứng với mỗi user thông tin được tiếp cận sẽ khác nhau.
Tuy nhiên, khi hệ thống của bạn tồn tại nhiều services và logic xử lý, cùng với lượng tải truy cập lớn, vấn đề authentication và authorization sẽ trở nên phức tạp và phát sinh nhiều vấn đề về hiệu suất.
Ở Netflix, kiến trúc được sử dụng để giải quyết bài toán Authorization là phân tán logic ra các service. Hệ thống Netflix sẽ chỉ có một service là Identity provider, service này sẽ quản lý trạng thái của người dùng như đã subscribe hay chưa. Còn các logic Authorization sẽ do các service con tự quản lý riêng.
Cách làm này khá dễ hiểu và dễ scale khi logic authorization còn đơn giản như "chỉ hiển thị thông tin A nếu người dùng đã subscribe",... Về lâu về dài khi các logic liên quan đến authorization ngày càng phức tạp hơn sẽ dẫn đến việc các logic phức tạp này bị duplicate ở nhiều service khác nhau, từ đó việc thay đổi logic sẽ ngày càng khó.
Để giải quyết vấn đề này thì Netflix bắt đầu thay đổi hệ thống của mình và tách ra một service chỉ chuyên xử lý phần logic Authorization. Khi theo kiến trúc này thì vấn đề phân mảnh logic sẽ được giải quyết, nhưng bù lại lượng request xử lý logic authorization này sẽ tăng lên. Song song với đó cũng phát sinh thêm vấn đề là do tính chất phổ biến của nó, service Authorization này sẽ có nguy cơ gây bất ổn cho toàn hệ thống nếu có lỗi phát sinh. Vậy team Netflix đã giải quyết bài toán này như thế nào?
Mời các bạn xem lại bài talk được chia sẻ bạn Travis Nelson, một kỹ sư làm việc tại team Access and Identity Management ở Netflix, giới thiệu về những thay đổi trong thiết kế cơ chế Authorization cùng các lưu ý trong quá trình design để giải quyết các vấn đề phát sinh như Failure domain isolation, dynamic fallback, caching, ...
Góc Lập Trình
Đề ra tuần này: Minimum Knight Moves
(by ndaadn)
Cho một bàn cờ vua rộng vô hạn, và quân mã tại toạ độ [0, 0]
. Quân mã có thể di chuyển tới một trong 8 vị trí tiếp theo trên bàn cờ. Hãy tìm số lần di chuyển nhỏ nhất để quân mã tới được toạ độ [x, y]
.
Lời giải đề bài tuần trước: Possible Bipartition
(by phucnh)
Bài toán này là một ứng dụng điển hình của đồ thị lưỡng phân (Bipartite graph), hay còn có tên tiếng Việt khác là đồ thị hai phía. Ta gọi mỗi người là một đỉnh của đồ thị, nếu người a ghét người b, ta nối đỉnh a với đỉnh b bằng một cạnh. Nếu ta có thể tô toàn bộ các đỉnh của đồ thị bằng nhiều nhất 2 màu, sao cho 2 đỉnh liền kề có màu khác nhau, ta có thể thoả mãn yêu cầu đề bài. Nếu ta phải dùng nhiều hơn 2 màu để tô toàn bộ các đỉnh của đồ thị, ta không thể chia n người thành 2 nhóm thoả mãn điều kiện đề bài.
Để thực hiện kiểm tra xem đồ thị có thể được tô bằng nhiều nhất 2 màu hay không, ta có thể thực hiện duyệt đồ thị theo chiều sâu (DFS) như sau: https://pastebin.com/UYhdNVKh
Trên thực tế, giải thuật trên đây cũng là cách đơn giản nhất để kiểm tra đồ thị lưỡng phân. Bên cạnh đó, ta cũng có thể thực hiện tô màu đồ thị với BFS.
Ngoài ra, tô màu đồ thị (Graph Coloring) là một dạng bài toán khá thú vị, và có nhiều ứng dụng trong thực tế, mời bạn đọc tham khảo thêm link Graph Coloring Problem
Code & Tools
bigquery-utils - một repo chứa các scripts, udfs, views, và các ứng dụng hữu ích khác giúp cho việc migration và các lệnh cho data warehouse ở BigQuery
cbindgen - một tool giúp khởi tạo C bindings cho Rust code
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
Code is like humor. When you have to explain it, it’s bad.
– Cory House