Kafka Consumer & Deserializer

Như đã nói sơ qua thì Kafka theo cơ chế Push – Pull. Và theo kiến thức từ Kafka Producer thì ta có thể ngầm hiểu là Producer chính là nhân tố push dữ liệu đến Kafka Broker.
Vậy nhân tố nào sẽ pull dữ liệu đó về và xử lý. Đó chính là các Consumer.

  • Consumer đọc data từ topic theo cơ chế pull (pull model).
  • Consumer có thể đọc 1 hoặc nhiều partition của topic
  • Nếu có nhiều Consumer cùng đọc chung 1 topic, Kafka Balancer sẽ chia 1 hoặc nhiều partition cho 1 consumer tuỳ theo số lượng
  • Nếu các Consumer đọc cùng 1 topic mà trong đó có 1 Consumer mất khả năng hoạt động thì Kafka Balancer sẽ tự cân bằng lại, data sẽ được lấy bởi những Consumer đang hoạt động (Q: Kafka làm được điều này bằng cách nào? Do broker hay do chính consumer xử lý?)
  • Data trong partition sẽ được đọc từ offset thấp tới cao, tức từ data được push vào cũ nhất đến mới nhất

Message Deserializer

Ở Producer, khi push data lên thì producer phải serialize nội dung sang dạng binary trước khi gửi. Vậy còn Consumer thì sao?
Consumer làm điều ngược lại đó là deserialize từ binary sang dạng nội dung đã được “chốt kèo” với producers. Cũng tương tự producer thôi, khi lấy message về, nội dung mà consumer nhận được đó là binary, Kafka API cung cấp sẵn 1 số deserialize sang các kiểu data phổ biến. Đầu vào (input) sẽ là binary (bytes[]) và đầu ra (output) sẽ là kiểu dữ liệu mà class/method này đã thể hiện trên tên của nó Vd: IntegerDeserializer = In: binary, Out: Integer
StringDeserializer = In: binary, Out: String


Một lưu ý quan trọng là nếu kiểu dữ liệu đã được chốt giữa producer và consumer, thì khi vận hành, tốt nhất phải tuân thủ kiểu dữ đã được chốt trước đó. Vì khi thay đổi thì cả đôi bên phải thay đổi theo. Ví như ban đầu bạn chốt kiểu String với dạng json, nhưng sau đó bạn chuyển sang kiểu String với dạng XML thì Consumer có thể sẽ bị lỗi do thiếu cover trường hợp này.

Leave a Reply

Your email address will not be published. Required fields are marked *


The reCAPTCHA verification period has expired. Please reload the page.