#225 - Xây dựng kiến trúc Event-Driven với Kafka, Spark, và Cassandra
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ề:
Ý nghĩa thuật ngữ data lake
Lý do RisingWave chuyển từ C++ sang Rust
Cách xây dựng kiến trúc hướng sự kiện với Kafka, Spark, và Cassandra
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
Real meaning of data lake, delta lake & lakehouse
(by ndquoc)
Thuật ngữ data lake (DL) đã thay đổi và phát triển theo thời gian, nên nó cũng có nhiều định nghĩa. Dù sử dụng định nghĩa nào, thì DL vẫn chỉ nên dùng cho mục đích lưu trữ. Tất cả các định nghĩa về DL vượt qua ngoài “raw data” đều có vấn đề, bởi vì việc kết hợp cả hai chức năng lưu trữ và tính toán sẽ làm tê liệt một số đường ống dữ liệu (data pipeline) và kiến trúc phân tích (analytics architecture). Cụ thể khi nhu cầu lưu trữ tăng lên, phải tăng thêm node hoặc thay thế cluster mới với tài nguyên về lưu trữ và tính toán lớn hơn. Bên cạnh đó, dữ liệu trong DL cần đảm bảo bốn tính chất sau:
Raw: giữ lại càng nhiều chi tiết gốc càng tốt (Việc lưu trữ dữ liệu raw có quá đắt không? Bạn có đang dùng data warehouse (DW) sai mục đích như một như DL không?)
Secure: tuân thủ các yêu cầu bảo mật (Ai có thể truy cập dữ liệu và tại sao?)
Readily usable: dữ liệu được làm sạch và đồng nhất trên nhiều nguồn (số liệu này có đáng tin cậy không?)
Easily accessible: hỗ trợ nhiều công cụ dành cho data engineer và data analyst.
Trước đây, một DL trải qua những giai đoạn như sau:
Sử dụng DW như một DL, kể cả những cloud DW hiện đại.
Thử sử dụng Hadoop (gần đây đang có xu hướng giảm).
Dùng cloud data lakehouse - một sản phẩm kết hợp DW và DL.
Tạo ra một (cloud) DL hiện đại, chỉ để lưu trữ.
Mời bạn đọc tìm hiểu chi tiết và thách thức ở mỗi giai đoạn ở bài viết bên dưới.
Building a Cloud Database from Scratch: Why We Moved from C++ to Rust
(by nhij)
RisingWave là một cloud-native streaming database được ra đời với mục tiêu tối ưu chi phí và độ phức tạp trong việc triển khai các ứng dụng real-time trên môi trường cloud. Khi bắt đầu xây dựng vào năm 2021, họ sử dụng C++ vì tất cả mọi người trong team lúc đó đã có nhiều kinh nghiệm nhiều năm với ngôn ngữ này. Qua thời gian, khi mà team có nhiều thành viên hơn, họ đã gặp phải nhiều vấn đề với việc viết bằng C++ như: coding style, memory leak, segmentation fault và nhiều lỗi phổ biến khác nữa. Họ đã tự đặt câu hỏi: liệu C++ có phải ngôn ngữ phù hợp cho team hiện tại để xây dựng một hệ thống cơ sở dữ liệu. Sau đó, họ đã đi đến quyết định viết lại toàn bộ bằng Rust sau quãng thời gian gần 7 tháng tranh luận nội bộ. Trong bài viết này, tác giả (cũng chính là CEO của RisingWave) sẽ chia sẻ rõ hơn các ưu, nhược điểm và chưa phù hợp khi họ xây dựng hệ thống bằng C++ cũng như giải thích lý do tại sao chọn Rust cùng với những bài học rút ra từ chính bản thân họ.
Build an Event-Driven Architecture with Kafka, Spark, and Cassandra
(by steven.do)
Am hiểu cách thức xây dựng hệ thống theo kiến trúc hướng sự kiện (event-driven architecture - EDA) là một kỹ năng quan trọng với các developer ngày nay, khi mà các tổ chức ngày càng quan tâm nhiều hơn vào dữ liệu theo thời gian thực để định hướng phát triển nghiệp vụ và kinh doanh. Thông qua bài viết tác giả muốn chia sẻ kinh nghiệm trong việc xây dựng một bộ toolkit theo kiến trúc hướng sự kiện với khả năng mở rộng cao (highly-scalable) ứng dụng các công nghệ Apache Spark, Apache Kafka, và Apache Cassandra.
Kiến trúc hướng sự kiện là một software pattern, cho phép các tổ chức phát hiện các "sự kiện" cùng với các trạng thái thay đổi và cập nhật quan trọng giúp tổ chức có thể phản hồi nhanh chóng theo thời gian thực hoặc cận thời gian thực. Trái ngược với kiến trúc "request/response", kiến trúc EDA cho phép thời gian phản hồi nhanh chóng hơn và trải nghiệm người dùng tốt hơn.
Thông qua bài viết, bạn sẽ có hiểu hơn về cách thức kết hợp Spark Streaming với Apache Kafka và Cassandra, cùng với kiến thức xử lý dữ liệu streaming và xử lý dữ liệu dạng khối (batches).
Góc Lập Trình
Đề ra tuần này: Verify Preorder Serialization of a Binary Tree
Một trong những cách để lưu cây nhị phân vào file là ta tiến hành ghi kết quả của việc duyệt cây theo thứ tự trước (preorder traversal), với những nút là null, ta ghi giá trị "#".
Đề bài cho một chuỗi, hãy kiểm tra chuỗi cho trước xem nó có phải là kết quả của việc duyệt cây theo thứ tự trước hay không.
Ví dụ:
Đầu vào: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
Kết quả: true
Lời giải đề bài tuần trước: Next Permutation
(by ndaadn)
Bài toán yêu cầu tìm hoán vị tiếp theo trong thứ tự từ điển của một số tự nhiên. Cách tiếp cận đầu tiên ta có thể nghĩ tới là sinh tất cả các hoán vị, sau đó tìm hoán vị tiếp theo của số đã cho theo thứ tự từ điển. Giải thuật này đòi hỏi phải sinh tất cả các hoán vị, vì vậy độ phức tạp về thời gian sẽ là O(n!)
, bởi với mỗi số tự nhiên, ta có tối đa n!
hoán vị.
Để giải bài toán này với độ phức tạp thời gian O(n)
, ta cần áp dụng cách tiếp cận sinh hoán vị mà Donald Knuth đã nêu trong bộ sách nổi tiếng The Art of Computer Programming (TAOCP). Giải thuật gồm ba bước chính như sau:
Tìm vị trí i cuối cùng, sao cho
nums[i] < nums[i + 1]
Từ vị trí
i + 1
, tìm k cuối cùng sao chonums[k] > nums[i]
, đổi chỗ của số ở i với kĐảo ngược mảng con từ vị trí
i + 1
Cần lưu ý ở bước 1, nếu ta không có số i nào thoả mãn điều kiện, ví dụ như mảng: [6, 4, 2, 1]
, thì đây là số cuối cùng theo thứ tự từ điển, ta tìm số tiếp theo bằng cách đảo ngược toàn bộ mảng.
Code & Tools
gh-ost - a triggerless online schema migration solution for MySQL
delta - an open-source storage framework that enables building a Lakehouse architecture with compute engines including Spark, PrestoDB, Flink, Trino, and Hive and APIs for Scala, Java, Rust, Ruby, and Python.
Quotes
Remember that code is really the language in which we ultimately express the requirements. We may create languages that are closer to the requirements. We may create tools that help us parse and assemble those requirements into formal structures. But we will never eliminate necessary precision—so there will always be code.
― Robert C. Martin
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)