2024-07-24 22:49 — 7 phút đọc

Kafka 101

#software-architecture#kafka#kafka-101


Apache Kafka

Publish/Subcribe Messaging

Là một hệ thống publish/subscribe, Kafka cho phép producer gửi message tới một topic cụ thể và consumer đọc message từ topic đó. Kafka không quan tâm đến dữ liệu được gửi, nó chỉ quan tâm đến việc dữ liệu được gửi tới đúng topic. Kafka không quản lý consumer, nó chỉ quản lý message được gửi tới topic. Consumer sẽ tự quản lý offset của message mà nó đã đọc.

Messages

Đơn vị được sử dụng để truyền thông giữa các producer và consumer trong Kafka được gọi là message. Mỗi message có chứa 1 bit tuỳ chọn dành cho metadata và nó được gọi là một key. Key đó là một mảng byte nó không thực sự có ý nghĩa đối với message và kafka. Key được sử dụng khi message được gửi vào các partition theo cách được kiểm soát nhiều hơn.

Để đạt được hiệu quả tốt nhất, các messages được viết vào kafka theo lô. Mỗi một lô chứa một tập hợp các messages và được gửi vào một partition. Việc truyền tải dữ liệu theo mỗi message sẽ gây tốn kém hơn về mặt quản lý và hiệu xuất. Tất nhiên rằng việc truyền tải dữ liệu theo lô cũng sẽ có những bất lợi như việc tăng thời gian trễ nhưng so với truyền tải dữ liệu theo mỗi message thì việc truyền tải dữ liệu theo lô sẽ hiệu quả hơn. Các lô cũng được nén và cung cấp khả năng xử lý hiệu quả hơn so với chi phí.

Schemas

Mặc dù các message có kiểu dữ liệu là các mảng byte mờ mịt đối với chính kafka. Schema được khuyến cáo làm nội dung cho các message. Có nhiều tuỳ chọn schema cho message, tuỳ thuộc vào nhu cầu và thiết kế ứng dụng của bạn. Các tuỳ chọn bao gồm Json, XML … Tuy nhiên, chúng thiếu tính năng để xử lý, quản lý các schema và các version của chúng. Để giải quyết vấn đề này nhiều nhà phát triển kafka đã đề xuất sử dụng Apache Avro. Avro cung cấp một định dạng nhỏ gọn, schema được tách biệt với các payloads message, không yêu cầu thay đổi code khi có sự thay đổi về schema, schema evolution và schema versioning.

Một định dạng dữ liệu nhất quán thực sự rất quan trọng, vì nó cho phép đọc và ghi các message một cách tách biệt. Khi các tác vụ đọc ghi được kết hợp, chúng ta có thể đảm bảo rằng các message được gửi từ producer sẽ được đọc chính xác bởi consumer. Các ứng dụng phải xử lý một cách đồng bộ, song song với các version cũ hơn của chúng.

Topics and Partitions

Message trong kafka được phân loại theo các topics. Các Topic cũng được chia thành các partition. Cùng quay trở lại với “commit log” thì partition là log duy nhất. Message được ghi vào partition theo thứ tự và không thể thay đổi vị trí (offset). Partition cũng là một cách mà kafka cung cấp khả năng dự phòng và mở rộng. Mỗi partition có thể được đặt trên một server khác nhau để tăng hiệu suất và khả năng chịu lỗi.

Multiple partition

Thuật ngữ về steam được thảo luận về dữ liệu trong các hệ thống như Kafka. Thông thường một luồng (stream) được coi là một topic duy nhất, bất kể số lượng partition. Điều này đại diện cho một luồng dữ liệu duy nhất từ producer đến consumer. Các thông điệp này là phổ biến khi nói về Kafka Streams, Apache Samza, hay Storm. Các phương pháp này có thể so sánh với các framework offline như Hadoop, được thiết kế để hoạt động với dữ liệu lớn.

Producers and Consumers

Kafka clients được chia thành 2 loại: producers và consumers. Ngoài ra còn có các APIs nâng cao khác như APIs Kafka Connect để tích hợp vào Kafka Streams để xử lý luồng. Các client cao cấp sử dụng producers và consumers để xây dựng các blocks và cung cấp các chức năng đọc, ghi, … từ kafka.

Producers tạo ra các messages mới. Trong hệ thống publish/subscribe chúng được gọi là publisher hoặc writers. Nói chung một message sẽ được gửi tới một topic cụ thể. Mặc định thì các producer sẽ không quan tâm tới message sẽ được gửi tới partition đặc biệt nào và gửi đều hết các message tới tất cả các partition. Trong một số trường hợp đặc biệt thì producer sẽ gửi message tới các partitions cụ thể. Điều này được thực hiện thông qua việc sử dụng key của message. Key sẽ được hash và gửi tới partition tương ứng. Điều này đảm bảo các message được tạo bằng key nhất định sẽ được gửi tới cùng một partition. Ngoài ra producer còn có thể sử dụng custome partitioner để xác định các message phải tuân theo quy tắc để mapping nó tới partition.

Consumers đọc các message được gửi từ hệ thống publish/subscribe người dùng có thể gọi là subscriber hoặc reader. Consumer có thể nhận từ 1 hoặc nhiều topics và đọc message theo thứ tự mà chúng được publish. Consumers theo dõi những message đã nhận bằng cách lưu trữ offset của message mà nó đã đọc. Offset là một loại metadata là một số nguyên liên tục tăng mà kafka thêm vào message khi nó được tạo ra. Mỗi message trong một partition nhất định sẽ được gán với một offset duy nhất. Bằng cách lưu trữ lại offset của consumed cuối cùng cho mỗi message trong mỗi partition, trong Zookeeper hoặc trong chính kafka thì consumer có thể dừng lại hoặc khởi động lại mà không đánh mất dữ liệu trong phân vùng đó.

Consumers giống như một phần của Consumers group, nó là một hoặc nhiều consumer làm việc chung một topic. Consumer group sẽ đảm bảo rằng mỗi partition sẽ chỉ được đọc bởi một consumer. Ở ảnh bên dưới ta thấy, Có 3 consumers trong consumer group được đọc từ một topic. Có 2 trong 3 consumer đọc từ mỗi một partition, consumer thứ 3 đọc từ 2 partitions còn lại. Việc mapping của một consumer tới một partition được gọi là ownership của partition bởi một consumer.

Bằng cách này thì, các consumers có thể được mở rộng theo chiều ngang để tăng hiệu suất và đảm bảo dữ liệu trong topics với lượng lớn messages. Ngoài ra, khi một consumer có lỗi thì consumer group sẽ tự động chuyển ownership của partition đó cho consumer khác trong group để đảm bảo rằng không có lỗi xảy ra trong việc đọc dữ liệu.

Consumer group

Brokers and Clusters

Một máy chủ kafka duy nhất được gọi là một broker. Broker sẽ nhận các message từ producer, gán offsets cho chúng, và commits các message để lưu trữ lại chúng trên ổ đĩa. Tuỳ thuộc vào phần cứng cụ thể, đặc điểm hiệu xuất của nó. Broker có thể dễ dàng xử lý hàng triệu messages mỗi giây.

Các kafka broker được thiết kế như là một phần của cluster. Bên trong là một cụm các brokers, trong đó có một broker sẽ có chức năng controller. Nó chịu trách nhiệm quản trị, bao gồm phân vùng và giám sát producers. Một partititon được sở hữu bởi một brokers duy nhất trong một cụm cluster và brokers đó được gọi là leader của các partition. Một partition có thể được gán cho nhiều broker để trở thành replicated. Điều này cung cấp các message dự phòng bên trong partition, để cho một broker khác có thể quản lý nếu có một broker gặp lỗi.

Kafka clusters

Một tính năng quan trọng của Kafka đó là retention, nó cho phép Kafka lưu trữ các messages lâu dài trong một khoảng thời gian. Kafka brokers được cấu hình để lưu trữ các messages mặc định cho từng topic (7 ngày) hoặc topic đạt đến khích thước tối đa (1 GB). Các messages cũ hơn sẽ bị xóa khi đạt đến giới hạn. Điều này giúp Kafka giữ cho lưu trữ của nó không bị quá tải và giữ cho hiệu suất cao. Các topic cũng có thể được cấu hình để lưu dưới dạng log compacted, nghĩa là Kafka chỉ lưu giữ lại message cuối cùng với mỗi key. Nó sẽ hữu dụng với các trường hợp thay đổi data, nơi chỉ quan tâm tới cập nhật cuối cùng.

Tài liệu tham khảo


aitu avatar

Hi! Tôi là Tuyên — Hiện tại tôi đang làm Software Architect, Senior developer tại một công ty nhỏ ở Hà Nội. Tôi cảm thấy thích thú, đam mê, yêu thích với việc viết lách và chia sẻ những kiến thức mà tôi biết. Hãy đọc nhiều hơn tại blogs và tới about để biết thêm về tôi nhé.