#194 - Joint Consensus trong CockroachDB
Trong số này, chúng ta sẽ cùng tìm hiểu về: Block Aggregator để truyền tải dữ liệu từ Kafka tới Clickhouse; Cách SoundCloud thiết kế kiến trúc Service Architecture; Cách CockroachDB làm Joint Consensus; Quá trình sharding dữ liệu tại Notion; Lời giải cho bài toán n queens; Và cuối cùng là bài nói về tham chiếu Null của Tony Hoare.
Những bài viết hay
Block Aggregator: Real-time Data Ingestion from Kafka to ClickHouse with Deterministic Retries
Trong một hệ thống lớn để ingest dữ liệu thời gian thực vào các cơ sở dữ liệu phân tích một cách hiệu quả, nhanh chóng để phân tích - chẳng hạn như là ClickHouse thì việc ưu tiên ingest theo số lượng lớn được đánh giá là tốt hơn so với việc xử lý theo từng khối lượng dữ liệu nhỏ, rời rạc. Các hệ thống này thường đối diện với những thử thách trong khi ingest dữ liệu như là việc trùng lặp hoặc mất dữ liệu.
Để giải quyết vấn đề này, các pipeline xử lý sẽ thường dựa vào một số các cơ chế buffering, chẳng hạn như Kafka, để lưu trữ dữ liệu tạm thời. Hệ thống này thường biết đến với tên gọi là message-processing engine. Mục đích của nó là tổng hợp các messages từ Kafka thành các khối dữ liệu, sau đó tải những dữ liệu này vào cơ sở dữ liệu phục vụ cho những mục đích nhất định.
Ở eBay, các kỹ sư phần mềm ở đây đã xây dựng hệ thống có tên là Block Aggregator phục vụ cho việc ingest dữ liệu từ Kafka đến ClickHouse, với hiệu suất có thể xử lý 1 triệu rows mỗi giây. Hệ thống được triển khai với khả năng scalable, highly available và fault-tolerant. Trong bài viết, tác giả đã nêu rõ về cách giải quyết các vấn đề gặp phải trong quá trình xây dựng hệ thống. Ngoài ra, bài viết còn trình bày về giao thức và thuật toán mà các kỹ sư phần mềm tại eBay đã phát triển trong Block Aggregator để giải quyết vấn đề trùng lặp dữ liệu và mất dữ liệu.
Service Architecture at SoundCloud - Part 2: Value-Added Services
Bài viết này là một phần trong series "Service Architecture at SoundCloud", mục đích chia sẻ quá trình kiến trúc SOA phát triển ở SoundCloud trong vài năm vừa qua. Trong bài viết này, tác giả miêu tả khái niệm Value-Added pattern phát triển từ các khái niệm cơ bản trong Domain-Driven Design, giúp giảm việc lặp lại code (code duplication) và sự phân tán logic về business và authorization trong hệ thống.
Theo tác giả, kiến trúc service ban đầu của SoundCloud có 2 lớp service: những edge service (service ngoài rìa) giúp truy vấn dữ liệu entity từ các foundation services (service nền tảng) và trả về cho các clients. Mỗi edge service điều phối các lần gọi và chịu trách nhiệm phần authorization. Việc này dẫn đến duplication về code, business logic, và authorization logic trong các edge service. Đây là một pattern nguy hiểm, vì authorization là phần nhạy cảm trong logic SoundCloud và việc đồng bộ và maintain code là tối quan trọng.
Để giải quyết, Value-added services (VAS) được thêm vào hệ thống như một layer đứng giữa edge services và foundation services (xem hình). Value-added service chịu trách nhiệm trả về các entity và các giá trị liên quan (nói cách khác là các aggregate) cho caller. Các logic về authorization cho mỗi entity tương ứng được tập trung hoá về các value-added service này. Điều này giúp chia trách nhiệm (separation of concerns) tốt hơn. Edge layer cung cấp giao diện api và đáp ứng các nhu cầu nhất định của clients, trong khi VAS tiếp nhận data từ foundation service, xử lí chúng thành các aggregate. Edge layer sau đó tiêu thụ các aggregate này.
VAS mang lại nhiều lợi ích to lớn. Lợi ích đầu tiên dễ thấy nhất là việc giảm code duplication liên quan tới logic điều phối và tổng hợp entity từ các edge service, tập trung hoá chúng lại một chỗ trong VAS để dùng lại. Việc này cũng giúp refactoring và tối ưu hoá dễ dàng và nhanh hơn. VAS còn giúp gom lại một codebase trung tâm cho logic về authorization, giúp kiểm thử phần mềm dễ dàng và giảm rủi ro logic không nhất quán và lộ lỗ hổng.
Sử dụng thêm VAS cũng mang thêm các bất cập như: tăng độ trễ network vì thêm layer; tăng chi phí cơ sở hạ tầng và bảo trì service mới. Tuy nhiên các kỹ sư SoundCloud cho rằng các lợi ích VAS mang lại vượt xa các đánh đổi này.
Trong bài viết gốc, tác giả có giới thiệu sơ bộ các khái niệm nền tảng trong domain-driven design như entity, aggregate, value objects, domain... Bài viết miêu tả chi tiết ứng dụng cụ thể của VAS cho phần quản lý Track và Playlist trong SoundCloud, kiến trúc trước và sau khi áp dụng VAS, các bước thực tế trong quá trình thực thi và các bài học đội ngũ đã rút ra. Mời các bạn đọc thêm để hiểu hơn nhé.
Góc Distributed System
Joint Consensus trong CockroachDB
CockroachDB tổ chức dữ liệu key-value thành nhiều cụm, mỗi cụm là một dải key-range và được replicate thành nhiều bản lưu trên các node khác nhau. Với mỗi cụm key-range CockroachDB sử dụng Raft protocol cho bài toán leader election, qua đó leader sẽ làm nhiệm vụ xử lý truy vấn và đồng bộ cho các follower. Như vậy, một hệ thống CockroachDB sẽ có rất nhiều cụm key-range và tương ứng là rất nhiều cụm raft consensus hoạt động độc lập nhau. Lưu ý là CockroachDB sử dụng thư viện etc/raft để phát triển raft protocol. Khi triển khai CockroachDB đặc biệt là ở cỡ lớn, một bài toán thách thức là ngăn ngừa Region Failure, xảy ra khi một region bị mất kết nối, làm cho Raft protocol không tiếp tục thực thi được nữa.
Bài viết sau mô tả cách CockroachDB phát triển Joint Quorum giải quyết vấn đề Region Failure. Joint Quorum cung cấp khả năng thiết lập Raft configuration động, linh hoạt để duy trì và cập nhật Raft membership giữa các nodes, thông qua cơ chế đồng bộ configuration của Raft protocol. Điểm mấu chốt của Joint Quorum là sử dụng cơ chế configuration change của Raft protocol: khi một replica nhận được configuration change log entry, nó sẽ kiểm tra và apply sự thay đổi đó.
Bạn đọc bài viết chi tiết để hiểu cách CockroachDB phát triển Joint Quorum và một số điểm khác biệt giữa Raft protocol với etcd/raft.
Góc Database
Quá trình sharding dữ liệu Postgres tại Notion và một số bài học rút ra
Đầu năm nay Notion đã tạm dừng hệ thống trong 5 phút để tiến hành nâng cấp nhằm tăng tính ổn định và hiệu năng. Đằng sau sự kiện 5 phút này là một chuỗi nhiều tháng làm việc của team Notion để sharding dữ liệu Postgres từ mô hình monolith sang phân chia dữ liệu theo chiều ngang. Nhiều quyết định và công việc đã được thực hiện trong suốt quá trình như là:
Quyết định thời điểm cần tiến hành sharding dữ liệu
Thiết kế kế hoạch cho việc sharding dữ liệu
Tiến hành migrate dữ liệu từ hệ thống cũ
Một số bài học rút ra sau lần nâng cấp này bao gồm: tiến hành việc shard dữ liệu sớm hơn; nhắm tới việc migration với zero-downtime; ...
Để việc migrate dữ liệu suôn sẻ, họ đã làm theo các bước sau:
Double-write: Ghi dữ liệu vào cả 2 hệ thống cũ và mới
Backfill: sau Bước double-write thành công, bắt đầu migrate dữ liệu cũ sang database mới
Verification: Thực hiện tiến trình kiểm tra tính đúng đắn nhằm đảm bảo dữ liệu được migrate trọn vẹn sang database mới. Ở mảng này, đội ngũ kỹ sư ở Notion đã thiết kế scripts để kiểm tra dữ liệu. Đồng thời, họ sửa read API để truy vấn dữ liệu ở 2 nguồn dữ liệu cùng một lúc để kiểm tra sự khác biệt giữa database cũ với mới.
Switch-over: Chuyển dần các luồng đọc dữ liệu từ hệ thống cũ sang mới
Góc Lập Trình
Đề tuần này:
Time Needed to Inform All Employees
Lời giải tuần trước:
Đề bài: https://leetcode.com/problems/n-queens/
Lời giải:
Bài toán sắp xếp n quân hậu trên bàn cờ n x n
là một bài toán kinh điển của giải thuật quay lui (backtracking). Tại hàng i với 0 <= i < n
, ta thử đặt quân hậu vào cột j với 0 <= j < n
sao cho quân hậu mới không thể bị ăn bởi những quân hậu trước đó, rồi tiếp tục thử với hàng i + 1
.
Nếu tại hàng i + 1
, ta không thể tìm được vị trí đặt quân hậu hợp lệ, ta thực hiện quay lui về hàng i, và tìm cột mới để đặt quân hậu.
Điều kiện để 2 quân hậu có thể ăn lẫn nhau là: hai quân hậu cùng nằm trên 1 hàng, hoặc 1 cột, hoặc 1 đường chéo. Ta có thể sử dụng (i - j)
và (i + j)
để mô phỏng thứ tự của các đường chéo.
Giải thuật có thể được thực hiện như sau: https://pastebin.com/TkS94hwS
Tech Talks
Null References: The Billion Dollar Mistake
Tony Hoare đã giới thiệu tham chiếu Null (Null reference) lần đầu tiên trong ALGOL W vào năm 1965. Và trong một bài thuyết trình vào năm 2009, ông đã trình bày suy nghĩ về quyết định đó và coi đó là "sai lầm hàng tỷ đô la của bản thân".
Ông đã nói: “Tôi gọi đó là sai lầm hàng tỷ đô của mình. Đó là phát minh của tham chiếu Null vào năm 1965. Vào thời điểm đó, tôi đang thiết kế một hệ thống toàn diện đầu tiên về xử lý tham chiếu cho một ngôn ngữ hướng đối tượng (ALGOL W). Mục tiêu của tôi là đảm bảo rằng tất cả việc sử dụng các tham chiếu phải an toàn tuyệt đối, với việc kiểm tra được thực hiện tự động bởi trình biên dịch. Nhưng tôi không thể chống lại sự cám dỗ để tạo ra một tham chiếu Null, đơn giản vì nó rất dễ thực hiện. Điều này đã dẫn đến vô số lỗi, lỗ hổng bảo mật và sự cố hệ thống, có lẽ đã gây ra thiệt hại hàng tỷ đô trong bốn mươi năm qua”.
Mời bạn theo dõi chi tiết qua bài thuyết trình của Tony Hoare.
Code & Tools
BadgerDB - An embeddable, persistent, and fast key-value database written in pure Go. It is the underlying database for Dgraph, a fast, distributed graph database
Flipper (formerly Sonar) - A platform for debugging mobile apps on iOS and Android and, recently, even JS apps in your browser or in Node.js. Visualize, inspect, and control your apps from a simple desktop interface. Use Flipper as is or extend it using the plugin API.
Góc Sponsors
Fossil Vietnam, formerly Misfit, is the Center of Excellence for Wearables Research & Development of Fossil Group. We’re an innovative team that designs and engineers world-class wearables products that touch the lives of millions of people. We take pride in being innovators who are pushing the boundaries of fashion and technology.
Why you’ll love working at Fossil Vietnam
Opportunities to work with global Tech giants.
Attractive salary and performance bonus twice a year.
Premium healthcare for employees and family, even on probation.
15 days of Annual leave and 2 days of Volunteer leave, even on probation.
All tools you need: Mac/Windows, iOS/Android, Testing devices/State-of-the-art wearables, you name it.
Welcome watch after probation.
You’ll get food to get fit, we’ll take care of it all.
Join us, and you’ll contribute to the development of next-generation wearable technology that makes a difference in people’s everyday lives. View all featured positions.
Keep in touch
Quotes
“Debugging is like being the detective in a crime movie where you are also the murderer.”
— Filipe Fortes