Hiểu chủ đề và phân vùng của Kafka


185

Tôi đang bắt đầu học Kafka cho mục đích giải pháp doanh nghiệp.

Trong các bài đọc của tôi, một số câu hỏi xuất hiện trong đầu tôi:

  1. Khi một nhà sản xuất đang tạo ra một thông điệp - nó sẽ chỉ định chủ đề mà nó muốn gửi tin nhắn đến, đúng không? Nó có quan tâm đến phân vùng không?
  2. Khi một thuê bao đang chạy - nó có chỉ định id nhóm của nó để nó có thể là một phần của cụm người tiêu dùng cùng chủ đề hay một số chủ đề mà nhóm người tiêu dùng này quan tâm không?
  3. Mỗi nhóm người tiêu dùng có một phân vùng tương ứng trên nhà môi giới hay mỗi người tiêu dùng có một phân vùng không?

  4. Là các phân vùng được tạo bởi các nhà môi giới, và do đó không phải là một mối quan tâm cho người tiêu dùng?

  5. Vì đây là một hàng đợi với phần bù cho mỗi phân vùng, nên người tiêu dùng có trách nhiệm chỉ định những thông điệp nào họ muốn đọc không? Có cần phải lưu trạng thái của nó?

  6. Điều gì xảy ra khi một tin nhắn bị xóa khỏi hàng đợi? - Ví dụ: thời gian lưu là 3 giờ, sau đó thời gian trôi qua, phần bù được xử lý ở cả hai bên như thế nào?

Câu trả lời:


162

Bài đăng này đã có câu trả lời, nhưng tôi đang thêm quan điểm của mình với một vài hình ảnh từ Hướng dẫn dứt khoát của Kafka

Trước khi trả lời từng câu hỏi, hãy thêm tổng quan về các thành phần của nhà sản xuất:

tổng quan về các thành phần sản xuất

1. Khi nhà sản xuất đang tạo một tin nhắn - Nó sẽ chỉ định chủ đề mà nó muốn gửi tin nhắn đến, đúng không? Nó có quan tâm đến phân vùng không?

Nhà sản xuất sẽ quyết định phân vùng mục tiêu để đặt bất kỳ thông báo nào, tùy thuộc vào:

  • Id phân vùng, nếu nó được chỉ định trong thông báo
  • key% num phân vùng , nếu không có id phân vùng được đề cập
  • Vòng tròn nếu không có id phân vùngkhóa tin nhắn có sẵn trong tin nhắn, có nghĩa là chỉ có giá trị

2. Khi một thuê bao đang chạy - Nó có chỉ định id nhóm của nó để nó có thể là một phần của cụm người tiêu dùng cùng chủ đề hoặc một số chủ đề mà nhóm người tiêu dùng này quan tâm không?

Bạn phải luôn luôn định cấu hình group.id trừ khi bạn đang sử dụng API gán đơn giản và bạn không cần lưu trữ offset trong Kafka. Nó sẽ không là một phần của bất kỳ nhóm nào. nguồn

3. Mỗi nhóm người tiêu dùng có một phân vùng tương ứng trên nhà môi giới hay mỗi người tiêu dùng có một phân vùng không?

Trong một nhóm người tiêu dùng, mỗi phân vùng sẽ chỉ được xử lý bởi một người tiêu dùng . Đây là những tình huống có thể xảy ra

  • Số lượng người tiêu dùng ít hơn số lượng phân vùng chủ đề, sau đó nhiều phân vùng có thể được chỉ định cho một trong những người tiêu dùng trong nhóm số lượng người tiêu dùng ít hơn phân vùng chủ đề
  • Số lượng người tiêu dùng giống như số phân vùng chủ đề, sau đó phân vùng và ánh xạ người tiêu dùng có thể như dưới đây, số lượng người tiêu dùng giống như số phân vùng chủ đề
  • Số lượng người tiêu dùng cao hơn số lượng phân vùng chủ đề, sau đó phân vùng và ánh xạ người tiêu dùng có thể được nhìn thấy bên dưới, Không hiệu quả, hãy kiểm tra Người tiêu dùng 5 số lượng người tiêu dùng nhiều hơn số lượng phân vùng chủ đề

4. Là các phân vùng được tạo bởi các nhà môi giới, do đó không phải là một mối quan tâm cho người tiêu dùng?

Người tiêu dùng nên biết về số lượng phân vùng, như đã thảo luận trong câu hỏi 3.

5. Vì đây là hàng đợi có phần bù cho mỗi phân vùng, nên người tiêu dùng có trách nhiệm chỉ định thư nào muốn đọc không? Có cần phải lưu trạng thái của nó?

Kafka (là Điều phối viên nhóm cụ thể ) sẽ xử lý trạng thái bù bằng cách tạo thông báo cho chủ đề __consumer_offsets nội bộ , hành vi này cũng có thể được định cấu hình thành thủ công bằng cách cài đặt enable.auto.committhành false. Trong trường hợp đó consumer.commitSync()consumer.commitAsync()có thể hữu ích cho việc quản lý bù.

Thông tin thêm về Điều phối viên nhóm :

  1. Đây là một trong những nhà môi giới được bầu trong cụm từ phía máy chủ Kafka.
  2. Người tiêu dùng tương tác với Điều phối viên nhóm để xác nhận bù đắp và tìm nạp các yêu cầu.
  3. Người tiêu dùng gửi nhịp tim định kỳ cho Điều phối viên nhóm.

6. Điều gì xảy ra khi một tin nhắn bị xóa khỏi hàng đợi? - Ví dụ: Thời gian lưu là 3 giờ, sau đó thời gian trôi qua, phần bù được xử lý ở cả hai bên như thế nào?

Nếu bất kỳ người tiêu dùng nào bắt đầu sau thời gian lưu giữ, tin nhắn sẽ được sử dụng theo auto.offset.resetcấu hình có thể latest/earliest. về mặt kỹ thuật, đó là latest(bắt đầu xử lý tin nhắn mới) bởi vì tất cả các tin nhắn đã hết hạn vào thời điểm đó và lưu giữ là cấu hình cấp chủ đề.


5
Chào ! Tôi là tác giả của câu trả lời được chấp nhận, nhưng tôi nghĩ câu trả lời của bạn cũng rất hay, đáng chú ý nhất là ở điểm số 3 nơi sơ đồ làm cho mọi thứ rõ ràng hơn 200%! Bạn có nghĩ rằng chúng ta nên hợp nhất?
C4stor

Tôi có nghĩa là tôi (hoặc bạn) có thể kết hợp các yếu tố trong câu trả lời của bạn trong tôi, để giúp họ thấy rõ hơn và cải thiện câu trả lời hàng đầu (hiện tại) này. Nhưng tôi sẽ không làm điều đó mà không có sự đồng ý của bạn!
C4stor

Tại sao không thể ánh xạ nhiều người tiêu dùng đến một phân vùng? Để đảm bảo tin nhắn chỉ cần xử lý một lần? Thx cho câu trả lời của bạn.
g10guang

1
@ g10guang: Đó là do khó khăn trong việc bảo trì bù đắp .
mrsrinivas

1
Một kịch bản khác. Bạn có thể có MỘT phân vùng và NHIỀU người tiêu dùng đã đăng ký / gán cho nó. Các nhà môi giới sẽ cung cấp hồ sơ cho người tiêu dùng đăng ký đầu tiên. Nhưng hãy giả sử người tiêu dùng đầu tiên mất nhiều thời gian hơn để xử lý tác vụ hơn khoảng thời gian thăm dò ý kiến. Tiêu thụ kỷ lục không được cam kết cho các nhà môi giới. Các nhà môi giới hiểu rằng người tiêu dùng đi chơi. Ở trạng thái này, nhà môi giới kích hoạt việc tái cân bằng gửi các phân vùng được gán mới cho tất cả người tiêu dùng. Tin nhắn được sử dụng lại bởi người tiêu dùng khác mặc dù nó vẫn đang được xử lý bởi C1. Hãy cẩn thận.
Ruben Daddario

127

Chúng ta hãy sắp xếp chúng theo thứ tự :)

1 - Khi nhà sản xuất đang tạo một tin nhắn - Nó sẽ chỉ định chủ đề mà nó muốn gửi tin nhắn đến, đúng không? Nó có quan tâm đến phân vùng không?

Theo mặc định, nhà sản xuất không quan tâm đến việc phân vùng. Bạn có tùy chọn sử dụng trình phân vùng tùy chỉnh để kiểm soát tốt hơn, nhưng đó hoàn toàn là tùy chọn.


2 - Khi một thuê bao đang chạy - Nó có chỉ định id nhóm của nó để nó có thể là một phần của cụm người tiêu dùng cùng chủ đề hoặc một số chủ đề mà nhóm người tiêu dùng này quan tâm không?

Có, người tiêu dùng tham gia (hoặc tạo nếu họ ở một mình) một nhóm người tiêu dùng để chia sẻ tải. Không có hai người tiêu dùng trong cùng một nhóm sẽ nhận được cùng một thông điệp.


3 - Mỗi nhóm người tiêu dùng có một phân vùng tương ứng trên nhà môi giới hay mỗi người tiêu dùng có một phân vùng không?

Cũng không. Tất cả người tiêu dùng trong một nhóm người tiêu dùng được gán một tập hợp các phân vùng, theo hai điều kiện: không có hai người tiêu dùng nào trong cùng một nhóm có bất kỳ phân vùng chung nào - và toàn bộ nhóm người tiêu dùng được gán mọi phân vùng hiện có.


4 - Các phân vùng được tạo bởi nhà môi giới, do đó không phải là mối quan tâm của người tiêu dùng?

Họ không, nhưng bạn có thể thấy từ 3 người hoàn toàn vô dụng khi có nhiều người tiêu dùng hơn các phân vùng hiện có, do đó, mức độ song song tối đa của bạn để tiêu thụ.


5 - Vì đây là hàng đợi có phần bù cho mỗi phân vùng, nên người tiêu dùng có trách nhiệm chỉ định thư nào muốn đọc không? Có cần phải lưu trạng thái của nó?

Có, người tiêu dùng lưu một phần bù cho mỗi chủ đề trên mỗi phân vùng. Điều này hoàn toàn được xử lý bởi Kafka, không phải lo lắng về nó.


6 - Điều gì xảy ra khi một tin nhắn bị xóa khỏi hàng đợi? - Ví dụ: Thời gian lưu là 3 giờ, sau đó thời gian trôi qua, phần bù được xử lý ở cả hai bên như thế nào?

Nếu người tiêu dùng từng yêu cầu một phần bù không có sẵn cho một phân vùng trên các nhà môi giới (ví dụ: do xóa), thì nó sẽ chuyển sang chế độ lỗi và cuối cùng tự đặt lại cho phân vùng này thành tin nhắn mới nhất hoặc cũ nhất có sẵn (tùy thuộc vào giá trị cấu hình auto.offset.reset) và tiếp tục hoạt động.


3
Sry :) Hơi khó giải thích toàn bộ quá trình kafka trong 500 hộp ký tự, tôi khuyên bạn nên đọc kafka.apache.org/documentation.html#theconsumer (và có lẽ là phần còn lại của phần 4, về nội bộ của kafka). Về cơ bản: người tiêu dùng yêu cầu tiết kiệm bù đắp, nhưng những người được lưu ở nơi khác.
C4stor

Tôi chỉ đọc cái này và vẫn không giải thích được nó được giữ ở đâu: Kafka xử lý việc này khác đi. Chủ đề của chúng tôi được chia thành một tập hợp các phân vùng hoàn toàn theo thứ tự, mỗi phân vùng được sử dụng bởi một người tiêu dùng tại bất kỳ thời điểm nào. Điều này có nghĩa là vị trí của người tiêu dùng trong mỗi phân vùng chỉ là một số nguyên duy nhất, phần bù của thông điệp tiếp theo sẽ tiêu thụ. Điều này làm cho nhà nước về những gì đã được tiêu thụ rất nhỏ, chỉ một số cho mỗi phân vùng. Trạng thái này có thể được kiểm tra định kỳ. Điều này làm cho tương đương với xác nhận tin nhắn rất rẻ.
Pinidbest

20

Kafka sử dụng khái niệm Topic để đưa trật tự vào luồng thông điệp.

Để cân bằng tải, một chủ đề có thể được chia thành nhiều phân vùng và được nhân rộng trên các nhà môi giới.

Các phân vùng được sắp xếp theo thứ tự, các chuỗi tin nhắn bất biến được nối liên tục, tức là nhật ký cam kết.

Các thông báo trong phân vùng có số id tuần tự xác định duy nhất từng thông báo trong phân vùng.

Các phân vùng cho phép nhật ký của một chủ đề mở rộng ra ngoài một kích thước phù hợp với một máy chủ (một nhà môi giới) và hoạt động như một đơn vị song song.

Các phân vùng của một chủ đề được phân phối trên các nhà môi giới trong cụm Kafka nơi mỗi nhà môi giới xử lý dữ liệu và yêu cầu chia sẻ các phân vùng.

Mỗi phân vùng được sao chép qua một số nhà môi giới có thể định cấu hình để đảm bảo khả năng chịu lỗi.

Giải thích rõ trong bài viết này: http://codeflex.co/what-is-apache-kafka/


Là phân vùng chỉ để cân bằng tải chủ đề?
g10guang

1
@ g10guang: phân vùng cũng giúp xử lý các tin nhắn song song.
mrsrinivas

Vui lòng sửa cho tôi nếu tôi sai, khi một tin nhắn được gửi bởi nhà sản xuất và khi nó đến trong chủ đề, nó sẽ sao chép nó vào các phân vùng theo cấu hình và sau đó người tiêu dùng sẽ sử dụng nó. Đúng?
Atul

1
@Atul tin nhắn sẽ được thêm vào 1 trong các phân vùng cho Chủ đề đó theo cấu hình của Trình phân vùng hiện tại (theo mặc định, hàm băm của khóa thông báo xác định phân vùng mà tin nhắn sẽ chuyển đến) và có, Người tiêu dùng sẽ nhận tin nhắn như nó tiêu thụ các thông điệp từ phân vùng đó
Kevin Hooke

@Kevin Hooke, cảm ơn đã giải thích và làm rõ sự hiểu biết của tôi.
Atul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.