+3

Kafka Consumer Concepts - Consumers và Consumer Groups

1. Mở đầu

Giả sử bạn có một ứng dụng cần đọc các message từ một topic Kafka, sau đó phân tích, xử lí logic và ghi kết quả vào một hệ quản trị cơ sở dữ liệu khác. Trong trường hợp này, ứng dụng của bạn sẽ tạo ra một đối tượng consumer, đăng ký vào topic phù hợp và bắt đầu nhận message, xử lí chúng và ghi kết quả. Điều này có thể hoạt động tốt trong một thời gian, nhưng nếu tốc độ mà các producer gửi message vào topic vượt quá tốc độ mà ứng dụng của anh em có thể xử lí? Nếu anh em chỉ có một consumer duy nhất để đọc và xử lý dữ liệu, ứng dụng của anh em có thể bị tụt lại phía sau, không thể theo kịp với tốc độ của các message đến. Rõ ràng là cần phải mở rộng khả năng tiêu thụ từ các topic. Giống như nhiều producer có thể ghi vào cùng một topic, chúng ta cũng cần cho phép nhiều consumers đọc từ cùng một topic, phân chia dữ liệu giữa chúng.

2. Các ví dụ chi tiết

Các consumers trong Kafka thường là một phần của một consumer group. Khi nhiều consumer đăng ký vào một topic và thuộc cùng một consumer group, mỗi consumer trong nhóm sẽ nhận message từ một tập con khác nhau của các partition trong topic đó.

Một consumer group với bốn partitions

Giả sử có chủ đề T1 với bốn partition. Bây giờ, nếu chúng ta tạo một consumer mới, C1, là consumer duy nhất trong consumer group G1, và đăng ký nó vào topic T1. Consumer C1 sẽ nhận tất cả các message từ cả bốn partition của T1. Xem Hình 1:

Bốn partition chia cho hai consumer trong một consumer group

Nếu chúng ta thêm một consumer khác, C2, vào consumer group G1, mỗi consumer sẽ chỉ nhận message từ hai partition. Ví dụ, message từ partition 0 và 2 có thể được gửi đến C1, trong khi message từ các partition 1 và 3 được gửi đến consumer C2. Xem Hình 2

Bốn consumer trong consumer group, mỗi consumer nhận message từ một partition

Nếu consumer group G1 có bốn consumer, thì mỗi consumer sẽ đọc message từ một partition duy nhất.

Nhiều consumer hơn số partition trong một consumer group có nghĩa là có consumer nhàn rỗi

Nếu chúng ta thêm nhiều consumer hơn vào một consumer group với một topic duy nhất so với số lượng partition, một số consumer sẽ ở trạng thái "rảnh rỗi" và không nhận message nào cả. Xem Hình 4

Thêm consumer group mới, cả hai nhóm đều nhận tất cả các thông điệp

Cách chính để mở rộng việc tiêu thụ dữ liệu từ một topic Kafka là bổ sung thêm nhiều consumers vào một consumer group. Các consumers Kafka thường thực hiện các thao tác có độ trễ cao như ghi vào cơ sở dữ liệu hoặc thực hiện các tính toán tốn thời gian trên dữ liệu. Trong những trường hợp này, một consumer đơn lẻ không thể theo kịp với tốc độ dữ liệu đẩy vào topic, và việc thêm nhiều consumers để chia sẻ khối lượng công việc—mỗi consumer chỉ xử lý một tập con của các partition và message là phương pháp chính để mở rộng. Đây là lý do tốt để tạo các topic với nhiều partitions—điều này cho phép thêm nhiều consumers khi khối lượng công việc tăng lên. Hãy nhớ rằng không có lý do gì để thêm nhiều consumers hơn số partitions trong một topic—một số consumer sẽ chỉ bị nhàn rỗi.

Ngoài việc thêm consumer để mở rộng một ứng dụng đơn lẻ, rất thường gặp việc có nhiều ứng dụng cần đọc dữ liệu từ cùng một topic. Thực tế, một trong những mục tiêu thiết kế chính của Kafka là làm cho dữ liệu được produce vào các topic Kafka có sẵn cho nhiều trường hợp sử dụng trong toàn tổ chức. Trong những trường hợp này, chúng ta muốn mỗi ứng dụng nhận tất cả các message, thay vì chỉ một tập con. Để đảm bảo một ứng dụng nhận được tất cả các message trong một topic, hãy đảm bảo rằng ứng dụng có consumer group riêng của nó. Khác với nhiều hệ thống nhắn tin truyền thống, Kafka có khả năng mở rộng đến số lượng lớn consumer và consumer group mà không làm giảm hiệu suất.

Trong ví dụ trước, nếu chúng ta thêm một consumer group mới (G2) với một consumer duy nhất, consumer này sẽ nhận tất cả các thông điệp trong topic T1, không phụ thuộc vào những gì G1 đang làm. G2 có thể có nhiều hơn một consumer, trong trường hợp đó, mỗi consumer sẽ nhận một tập con của các partition, giống như chúng ta đã trình bày cho G1, nhưng G2 nói chung vẫn sẽ nhận tất cả các message bất chấp các consumer group khác. Xem Hình 5

3. Kết luận

Tóm lại, anh em tạo một consumer group mới cho mỗi ứng dụng cần nhận tất cả các message từ một hoặc nhiều topic. Anh em thêm consumer vào một consumer group hiện có để mở rộng việc đọc và xử lý các message từ các topic, do đó mỗi consumer bổ sung trong group chỉ nhận một tập con của các message.

4. Thông tin kết nối

Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:

Rất mong được kết nối và cùng thảo luận!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí