Apache Kafka là một nền tảng truyền giữ liệu phân tán (distributed streaming platform) được phát triển ban đầu bởi LinkIn và sau đó trở thành dự án Apache nguồn mở từ năm 2011. Kafka được viết bằng ngôn ngữ Scala và Java theo mô hình Publish – Subscribe trong đó bên Publish dữ liệu gọi là Producer còn bên nhận dữ liệu là Consummer. Kafka quản lý dữ liệu theo từng Topic và mỗi Topic có thể có nhiều Subscriber.

Khi làm việc với Kafka, chúng ta cần nắm được một số khái niệm quan trọng sau:

– Producer: Producer có vai trò publish các dữ liệu theo từng Topic và các dữ liệu này được gửi đến Partition của Topic lưu trữ trên Broker.

– Consumer: các consummer đọc dữ liệu từ Topic mà mình đã Subscribe. Mỗi một consumer có thể subscribe nhiều topic và nhiều consumer có thể cùng đọc một topic.

– Topic: Topic được dùng để phân loại dữ liệu trong Kafka và thông thường ta sẽ tạo một Topic cho dữ liệu của từng ứng dụng khác nhau. Ví dụ như ta tạo một topic với tên ‘Facebook Data’ cho các dữ liệu thu thập được từ Facebook hoặc ‘Twitter Data’ cho các dữ liệu thu thập được từ Twitter.

– Partition: Partition là nơi lưu trữ dữ liệu cho một Topic. Mỗi Topic có thể có một hay nhiều Partition. Các dữ liệu được lưu trữ trên Partition theo một trật tự bất biến và được gán cho một ID gọi là Offset

– Broker: Broker là nơi lưu trữ các Partition và một Broker có thể có một hoặc nhiều Partition.

Để dễ hình dung về nguyên tắc hoạt động chung của Kafka, ta có thể lấy một ví dụ về ứng dụng của Kafka trong việc phát triển hệ thống nhằm phân tích đánh giá của người dùng về một sản phẩm mới của công ty trên các trang mạng xã hội. Trước hết ta sẽ có các Kafka Producers là các trang mạng xã hội (mỗi một trang mạng xã hội là một Producer như Facebook, Twitter, Weibo,…). Các Producers này sẽ tiến hành thu thập thông tin trên từng mạng xã hội của mình rồi truyền về Kafka. Kafka sẽ lưu trữ dữ liệu trong Broker với các Kafka Topic  tương ứng (ta tạo các Kafka Topic cho từng mạng xã hội như ‘Facebook Data’, ‘Twitter Data’ , ‘Weibo Data’,…). Hệ thống phân tích đánh giá của chúng ta sẽ đóng vai trò là một Consumer, lấy dữ liệu từ Kafka để tiến hành quá trình phân tích ở các bước tiếp theo (xem thêm tại các bài tutorials về Apache Spark). Consumer này có thể subscribe tất cả các topic hoặc chỉ một vài topic cụ thể. Ví dụ như nếu hệ thống của chúng ta chỉ cần phân tích đánh giá của người dùng trên mạng Facbook thì ta chỉ cần subscribe topic ‘Facebook Data’.

Đến đây, nhiều người có thể đặt ra câu hỏi: Liệu Kafka có xóa dữ liệu sao khi nó được truyền thành công đến Consumer hay không?
Trên thực tế, Kafka không cho phép người dùng thiết lập chế độ xóa ngay sau khi dữ liệu được truyền đến Consumer thành công mà chỉ cho phép thiết lập khoảng thời gian xóa dữ liệu với log.rentation.hours (mặc định, tham số này là 168 giờ tức là dữ liệu sẽ được xóa sau 7 ngày). Nếu chúng ta thiết lập tham số này thấp thì có thể sẽ bị mất dữ liệu nếu trong khoảng thời gian đó Consumer của chúng ta chưa kịp lấy dữ liệu về từ Kafka.

Ngoài ra, để đảm bảo rằng một đoạn dữ liệu (message) không được truyền lặp lại tới một Consumer, Kafka sử dụng giá trị Offset (là một pointer chỉ đến head của message queue) cho từng Consumer. Khi một message được gửi thành công đến Consumer thì giá trị Offset sẽ tăng lên để trỏ tới message tiếp theo. Việc sử dụng giá trị Offset cũng cho phép ta dễ dàng điều chỉnh về một thời gian nhất định để Consumer có thể đọc lại các dữ liệu từ thời gian đó.

Tháng Mười Một 9, 2018
ITechSeeker