#196 - Chuyển đổi từ Monolithic DataLake sang Distributed Data Mesh
Trong số này, chúng ta sẽ cùng tìm hiểu về: Cách eBay xây dựng hệ thống coupons; Hiệu quả của Recurrent Neural Networks; Cách Google xây dựng high availability writes cho Spanner; Giao thức FIDO2 và WebAuthn; Chuyển đổi từ Datalake sang Distributed Data Mesh; Thử thách lập trình tuần này về shortest path trong một binary matrix; và cuối cùng là cùng nghe về bài tech talk về kiến trúc đơn hướng.
Những bài viết hay
The Engineering Behind Coded Coupons, eBay’s New Seller Tool
eBay's coded coupon tool là một trong những sản phẩm mới nhất cho người bán (seller) để hướng người mua (buyer) quay lại và mua thêm nhiều sản phẩm từ cửa hàng của họ. Tính năng mới này giúp cho seller có thể tự tạo coupon, tùy chỉnh mã giảm giá được chia sẻ publicly trên eBay, hay privately thông qua các kênh marketing của seller, hay seller có thể in coupon code bên trong gói hàng để tăng khả năng tiếp tục mua hàng từ những khách hàng của họ. Hơn một triệu buyer đã mua hàng có sử dụng coupon code từ tool này kể từ khi được ra mắt vào tháng 4, 2021.
Coded coupon cho seller sự linh hoạt và quyền kiểm soát mà họ tìm kiếm, thông qua cách họ offer những ưu đãi cho khách hàng. Mỗi coupon có 5 thành phần riêng biệt:
Một mã coupon unique.
Một discount level.
Lựa chọn public/private khi expose coupon.
Cách để define eligible inventory.
Cơ chế để schedule cho promotion duration.
Seller có thể chọn loại discount tương ứng với nhu cầu như: giảm trên giá tiền, giảm theo phần trăm, hay giảm phần trăm trên nhiều item khi mua cùng nhau. Họ cũng có thể cài đặt những biến cấu hình như: tổng budget để chạy promotion, khách hàng nào có thể thấy được các coupon codes, promotion sẽ chạy trong thời gian nào, hay những items nào là hợp lệ cho promotion.
Tab marketing phục vụ cho cả seller và buyer trên eBay's marketplace, và phải đối mặt với thử thách về scale: Seller sẽ xử lý "promotion" entity, trong khi buyer sẽ xem và tương tác với "item" entity. Để scale được hệ thống theo chiều ngang đáp ứng được cho cả seller và buyer, eBay đã áp dụng dual-write system, trong đó sử dụng đồng thời Oracle và MongoDB là dữ liệu nguồn (source of data). Oracle giúp seller tạo và quản lí promotion với rất nhiều mức độ khác nhau về inventory và các lựa chọn khi scheduling promotion. Trong khi đó, MongoDB Cluster sẽ hỗ trợ scale hàng tỉ lượt views, hiển thị các thông tin discount một cách strategic thông qua lịch sử tìm kiếm của buyer và các transaction journals.
Với các metrics được cung cấp trong bài viết, platform mới này có thể xử lý một cách liền mạch một lượng lớn promotion được tạo và quản lí hàng ngày. Kiến trúc "dual-write" cung cấp sự linh động để scale cho một lượng lớn seller promotion được khởi tạo và các promotion data này được đưa đến buyer mà không gặp phải các vấn đề về delay trong quá trình tính toán hay bottleneck. Platform này còn chuẩn bị cho cả sự thay đổi của thị trường theo mùa hoặc theo yếu tố khác, tự động hóa việc horizontally scaling bằng cách tăng/giảm số lượng server yêu cầu.
The Unreasonable Effectiveness of Recurrent Neural Networks
Mạng neuron hồi quy (Recurrent Neural Networks - RNN) có một API rất đơn giản: nhận input vector X và trả về output vector Y. Tuy nhiên, quan trọng là dữ liệu của các output vector này sẽ không chỉ chịu tác động từ input mà còn từ toàn bộ lịch sử của input trong quá khứ.
Để thử nghiệm RNN, tác giả sử dụng mạng hồi quy Long Short-Term Memory (LSTM) cho việc xây dựng các mô hình ngôn ngữ ở cấp độ chữ cái với tập huấn luyện lấy từ những nguồn như các bài luận về startup của Paul Graham, văn của Shakespeare, tập 100MB bài viết Wikipedia của giải thưởng Hutter, tài liệu hình học đại số ở định dạng Latex, mã nguồn của Linux.
Kết quả mang lại rất đáng chú ý: RNN có thể tạo ra các văn bản tiếng Anh khá chuẩn về mặt chính tả, sao chép được các cấu trúc cú pháp khái quát. Nó tự làm giả URL, học được cách đóng mở ngoặc, tạo headings/lists theo cấu trúc Markdown, làm ra file XML hợp lệ và tự bịa ra timestamp, ID, ... Khi viết code C, RNN cũng cho ra các đoạn code rất ít lỗi cú pháp, dùng string và các kí hiệu pointer phù hợp, dòng code theo hàng rất tốt, và thậm chí còn biết khi nào tạo ra file mới với bố cục theo thứ tự: comment theo mẫu GNU license, include header files, define macros, code.
Mời các bạn đọc bài viết gốc để có thêm thông tin chi tiết và ảnh minh họa.
Spanner's high availability writes
Thông thường, với các databases truyền thống (MySQL, PostgreSQL), việc scaling và tăng tính availability cho transaction reads sẽ dễ dàng hơn writes. Dữ liệu được replicated qua các read-only replicas từ một node master thông qua cơ chế synchronously hoặc asynchronously.
Với mô hình synchronous, node master sẽ tuần tự write vào các read-only replicas với mỗi write transaction. Phương pháp này đảm bảo được data consistency, nhưng tốn chi phí cho mỗi write vì node master phải write vào tất cả các replicas trước khi return. Còn với mô hình asynchronous,
các read-only replicas sẽ lấy dữ liệu thông qua stream hoặc replication log. Phương pháp này giúp cho việc write nhanh hơn, nhưng lại phát sinh việc data inconsistency giữa master và replicas.
Spanner là một distributed database được phát triển bởi Google, với độ availability lên tới 99.999%, đã tiếp cận vấn đề trên dưới một góc độ khác. Một Spanner instance chứa nhiều read-write replicas, read-only và witness replicas. Trong đó, witness replicas không phục vụ dữ liệu, mà chỉ tham gia vào việc “voting” leader và committing writes. Với single region instance thì chỉ read-write replicas được phép sử dụng, còn read-only và witness replicas chỉ available cho multi-regional instance. Spanner là distributed database, nên khi dữ liệu bắt đầu lớn, data sẽ được chia thành các “chunk” gọi là Split. Mỗi split sẽ được replicated và có leader replica. Khi có thao tác write, Spanner sẽ tìm xem row đó thuộc split nào và điều hướng đến leader replica của split đó.
Và để write thành công, leader replica đồng thời replicate các thay đổi đến các replicas có khả năng committing write (voters), và khi đa số các voters này đồng ý commit thì thao tác write sẽ thành công. Cách này giúp cho việc write vẫn có thể hoạt động bình thường kể cả khi một read-write replica bị down, vì Spanner chỉ cần đa số các voters commit chứ không yêu cầu tất cả các replicas (Paxos consensus).
Khi một transaction write cần thao tác trên nhiều split khác nhau, Spanner sẽ sử dụng two-phase commit (2PC) để thực hiện transaction. Ngoài ra, Spanner đảm bảo được tính bền vững nhờ hệ thống file phân tán của Google có tên là Colossus. Colossus cũng cung cấp cơ chế replication và encryption.
Spanner là một hệ cơ sở dữ liệu phân tán, nên sẽ gặp phải nhiều vấn đề như internal abort, timeouts hơn hệ thống cơ sở dữ liệu truyền thống khi thao tác write. Và để hỗ trợ thêm, Spanner client library có cơ chế retry khi gặp các lỗi này trong quá trình sử dụng.
Góc Distributed System
Passwordless future using FIDO2 & WebAuthn
Cho dù tường lửa có bảo mật như thế nào, hệ thống phát hiện và ngăn chặn xâm nhập (IDS và IPS) có mạnh như thế, hệ thống được thiết kế tốt như thế nào thì yếu tố con người luôn là mắt xích yếu nhất trên không gian mạng.
“The weakest link in the security chain is the human element” — Kevin Mitnick
Có thể dễ thấy rằng, mật khẩu là một trong những cách thông dụng và đơn giản để xác thực người dùng. Tuy nhiên, vài năm gần đây, nhiều công ty cung cấp dịch vụ internet đã không bảo vệ mật khẩu của người dùng đủ tốt, dẫn đến việc rò rỉ thông tin đăng nhập trong các cuộc tấn công và rò rỉ data. Hackers có thể sử dụng các thông tin đã bị lộ và cướp quyền truy cập dễ dàng.
Chúng ta sẽ thảo luận về FIDO2 và WebAuth, 2 chuẩn xác thực sẽ giúp cải thiện và giảm thiểu các rủi ro bảo mật có liên quan đến con người.
WebAuthn và FIDO2 là gì?
FIDO2 là giao thức đăng nhập không cần password, chống phising hiệu quả. FIDO2 được phát triển bới nỗ lực hợp tác giữa FIDO Alliance và W3C. Mục đích của dự án là tạo ra 1 chuẩn định danh/xác thực mạnh trên nền web. Vào tháng 3, 2019, W3C đã thông báo WebAuthn đã trở thành là tiêu chuẩn chính thức cho việc xác thực không cần mật khẩu.
FIDO2 bao gồm 2 thành phần chính: W3c WebAuthn và FIDO Client to Authenticator Protocol (CTAP). FIDO’s CTAP được phát triển dựa trên chuẩn Universal 2nd Factor (U2F)
CTAP là tập hợp các giao thức cho phép giao tiếp giữa thiết bị và công cụ xác thực: NFC/ USB/ Bluetooth Low Engery (BLE)
Góc Database
Chuyển đổi từ Monolithic DataLake sang Distributed Data Mesh
Ở kỳ trước, nhóm biên tập đã giới thiệu về kiến trúc Data Lakehouse, được đưa ra bởi một số công ty như Snowflake, Databricks nhằm giải quyết những vấn đề cụ thể của Data Lake như concurrency, data governance, data quality, ... Cách tiếp cận Lakehouse có thể nói thiên về hướng cải tiến các công nghệ hiện có đang được dùng để triển khai Data Lake và tạo ra những công nghệ mới hoàn thiện hơn.
Tuy nhiên, liệu phát minh ra một công nghệ mới có giải quyết được vấn đề nếu những con người trong tổ chức đó vẫn quen với lối tư duy và làm việc theo phong cách cũ?
Trong bài viết này, tác giả Martin Fowler chia sẻ đề xuất về một cách tiếp cận mới không chỉ tập trung vào khía cạnh công cụ, mà còn khảo sát khía cạnh tổ chức con người đó là Data Mesh as a Platform.
Data Mesh as a Platform tập trung vào khai thác một số ý tưởng sau:
Xây dựng các cross-function team. Trong đó các team business của từng domain sẽ có Data Owner và Data Engineer là một thành phần của team mình. Mỗi team sẽ tự quản lý các data pipeline và dữ liệu của team mình.
Có team Data Infrastructure Engineer hướng đến xây dựng hạ tầng Data của cả tổ chức. Các bạn trong team này sẽ hướng đến xây dựng một self-serving platform cho các domain team ở trên. Ngoài ra các bạn engineer của team này sẽ không quan tâm đến các business domain cụ thể.
Data products được xem là first-class citizen, còn việc định dạng data như thế nào, sync thông qua pipeline nào, ... được xem là yếu tố phụ trợ.
Mời các bạn đọc bài viết của Martin Fowler ở đây để hiểu thêm.
Góc Lập Trình
Đề tuần này:
Shortest Path in Binary Matrix
Lời giải tuần trước:
Đề bài: Clone Graph
Lời giải:
Để giải bài này, ta cần thực hiện deep clone, nghĩa là thuộc tính neighbors của node mới phải chứa tham chiếu tới những node đã được clone, thay vì tham chiếu tới những node của đồ thị gốc. Vì vậy, ta cần lưu trữ ánh xạ 1-1 giữa node gốc và cloned node, và cấu trúc dữ liệu Map cho phép ta thực hiện việc lưu trữ, truy xuất ánh xạ với độ phức tạp time complexity O(1). Phần clone đồ thị, ta chỉ cần thực hiện duyệt đồ thị như sau: https://pastebin.com/hsw7cpUP
Giải thuật trên thực hiện tìm kiếm theo chiều sâu (DFS), độ phức tạp time complexity là O(V + E)
với V là tổng số node, E là tổng số hàng xóm của các node, và space complexity là O(V)
.
Bài này cũng có thể giải được bằng phương pháp tìm kiếm theo chiều rộng (BFS), xin dành lời giải cho bạn đọc.
Tech Talks
What if the user was a function? by Andre Staltz at JSConf Budapest 2015
Đây là một trong những bài giới thiệu tốt nhất về unidirectional architecture (Kiến trúc đơn hướng). Thay vì những kết nối phức tạp giữa các component trong các architecture truyền thống (ví dụ như Model-view-control), chúng ta sẽ có một data flow đơn giản một chiều như sau: Model là input cho View, người dùng (User) sẽ tương tác với View, sự tương tác đó sẽ được đẩy vào Model, từ đó Model sẽ update View.
Nếu bạn nào làm Android và hứng thú với architecture này có thể tham khảo thêm video này: Borrowing the Best of the Web to Make Native Better hoặc Managing the Reactive World with RxJava
Code & Tools
Góc Sponsors
One Mount là tập đoàn kiến tạo hệ sinh thái công nghệ lớn nhất Việt Nam, cung cấp các giải pháp và dịch vụ xuyên suốt chuỗi giá trị, từ lĩnh vực dịch vụ tài chính, phân phối, bất động sản và bán lẻ, với ba sản phẩm chủ lực: VinShop, VinID, OneHousing.
Với trụ sở tại Hà Nội, Hồ Chí Minh và quy tụ hơn 1.500 nhân sự xuất sắc, One Mount tâm huyết xây dựng môi trường làm việc:
Đề cao "Giá trị của công việc ý nghĩa"
Quy tụ nhân tài Việt trên toàn cầu
Văn hóa thành công cùng nhau vươn tới đỉnh cao
Các vị trí hấp dẫn đang mở tuyển:
Back-end Engineer (Java/Golang), Front-end Engineer (ReactJS, Angular), Mobile Developer (iOS, Android)
Data Analysis, Data Engineer, Data Scientist
Business Analysis, QC Engineer
Tham khảo các thông tin về văn hóa, môi trường làm việc, cơ hội nghề nghiệp tại One Mount:
Website: https://careers.onemount.com/
Quotes
Programs must be written for people to read, and only incidentally for machines to execute.
- Harold Abelson, Structure and Interpretation of Computer Programs