Giới thiệu và cài đặt Kafka
Cài đặt Kafka
Giới thiệu Kafka
Apache Kafka là gì?
Kafka là một message broker chạy trên hệ thống phân tán. Kafka đang được phát triển và bảo trì bởi tổ chức Apache, do đó hay còn gọi là Apache Kafka. Kafka có mã nguồn mở. Tên Kafka được đặt theo tên của một nhà văn / tiểu thuyết gia nổi tiếng Franz Kafka.
Giải thích message broker
Message broker mình không biết nên dịch qua tiếng Việt như thế nào cho sát nghĩa. Message nghĩa là tin nhắn, còn broker nghĩa là môi giới. Về cơ chế, ta có thể hiểu nôm na rằng các gói dữ liệu (message) sẽ được module message broker đón nhận và tổ chức lưu trữ (trên vùng nhớ hoặc đĩa), sau đó sẽ có một hệ thống khác truy cập message broker để lấy ra các gói dữ liệu này để xử lý.
Trong cùng lĩnh vực message broker, ta còn có một "đối thủ" khác của Kafka, đó chính là RabbitMQ.
Cơ chế vận hành của Kafka
Vai trò của Kafka là kết nối giữa producer và consumer. Producer là các đơn vị có data, message cần gửi đi. Consumer là các đơn vị sẽ tiêu thụ data, message. Kafka tổ chức phân loại các message theo chủ đề (topic).
Nói vui rằng message broker (Kafka) hoạt động như một anh môi giới nhà đất chính hiệu. Anh ta cất giữ nhiều tài liệu (message) bất động sản của nhiều người rao bán nhà (producer), cứ có ai cần bán hay cho thuê mặt bằng gì đều đẩy thông tin (message) đến cho anh ta (message broker). Sau đó, những người có nhu cầu (consumer) về bất động sản sẽ liên hệ anh môi giới này để lấy thông tin (message) phù hợp với nhu cầu / chủ đề (topic) mình đang có. Những người tiêu thụ có cùng nhu cầu có thể được tổ chức phân nhóm (group). Minh vừa giải thích cách vận hành của Kafka gần theo cuộc sống.
Kafka là một hệ thống phân tán
Apache Kafka được phát triển trên nền tảng Apache ZooKeeper. ZooKeeper là một nền tảng mã nguồn mở quản lý hệ thống phân tán (nhiều máy tính). Do đó, Kafka có khả năng scale up chạy trên nhiều máy.
Tính chất của Kafka:
- Fast: cực kỳ nhanh @ gửi nhận và đọc message.
- Scalable: khả năng mở rộng lên nhiều máy. Trào lưu máy tính hiện tại là vận hành hệ thống lớn trên nhiều máy thay vì đầu tư phần cứng vào một máy tính cấu hình cực mạnh.
- Reliable: tính tin cậy, nội dung message sẽ được backup trên nhiều máy trong hệ thống phân tán.
Ứng dụng Kafka vào đâu?
Sau khi nắm rõ cơ chế vận hành của Kafka, Minh xin gợi ý việc áp dụng Kafka ở vài vấn đề cụ thể sau:
- Hệ thống IoT: như mọi người đã biết, Internet of Things cho phép các thiết bị gửi các dữ liệu thu thập được (qua sensor chẳng hạn) đến hệ thống máy chủ. Ta có thể dùng Kafka để đón nhận các dữ liệu này, thay vì phải tự phát triển API. Vì dữ liệu thu thập bởi thiết bị có thể nói chúng là "Big data", tần suất gửi đi là rất lớn, yêu cầu xử lý và đáp ứng trong real-time.
- Stream processing: đây là một bài toán yêu cầu phân tích luồng dữ liệu (stream) với tốc độ cao. Một bài toán ví dụ đó là ta muốn phân tích hành vi xem sản phẩm của người dùng trên web. Ta sẽ cần ghi nhận lại các dữ liệu thô đơn giản như cú click chuột, đơn hàng. Số lượng người xem web lớn do đó lượng message gửi đến sẽ cực kỳ nhiều và đòi hỏi phân tích tốc độ cao ở real-time.
- Chuyển đổi ngôn ngữ lập trình: ta muốn chuyển ngôn ngữ lập trình cấp thấp hơn sang cấp cao hơn, ví dụ từ C sang Python. Các giải pháp về share memory để có thể tích hợp 2 ngôn ngữ lập trình thì rất khó khăn để hiện thực. Do đó, một giải pháp đơn giản thú vị hơn đó là đẩy kết quả dữ liệu của chương trình viết bằng C vào Kafka, sau đó ta dùng chương trình Python để lắng nghe "topic" cụ thể lấy ra dữ liệu (message) tương ứng để phân tích hoặc xử lý tiếp. Đây là một cách khá khả quan, chính nhờ sau khi tìm hiểu Kafka mình phần nào giải thích được làm thế nào mà một số hệ thống lại build được dùng nhiều ngôn ngữ lập trình khác nhau :D.
- Phân tích log, sự kiện: in log trong lúc hệ thống đang chạy khá quan trọng cho việc bảo trì hệ thống. Khi ta có nhu cầu về phân tích các log này, ta có thể đây dữ liệu log vào Kafka.
Một số liên kết cho việc tìm hiểu Kafka
- Trang chủ Kafka: https://kafka.apache.org/
- Kafka benchmark: Benchmarking Apache Kafka: 2 Million Writes Per Second (On Three Cheap Machines)
- Mã nguồn Kafka: https://github.com/apache/kafka (15.3k stars trên Github)
- Kafka documentation: https://kafka.apache.org/documentation/
- Thư viện Kafka (Kafka clients): https://cwiki.apache.org/confluence/display/KAFKA/Clients
Cách dùng Kafka lúc lập trình
Minh nói vắn tắt cách dùng Kafka để bạn đọc có thể tiếp cận nhanh hơn.
- Mình cài đặt ZooKeeper và Kafka vào máy. Kafka server sẽ chạy tại một địa chỉ, ví dụ: localhost:9092
- Cấu hình file config của Kafka tùy theo nhu cầu. Cái này bạn phải tìm tài liệu và tìm kiếm thêm trên Internet.
- Để có thể gửi message lên Kafka, chương trình có vai trò là "producer" bạn cần phải tích hợp thư viện Kafka (Kafka client) vào, tùy theo ngôn ngữ mình đang lập trình. Và dùng đúng như hướng dẫn mà thư viện đó cung cấp.
- Tương tự cho chương trình có vai trò "consumer" (lấy dữ liệu từ Kafka ra), ta cũng tích hợp Kafka client phù hợp ngôn ngữ lập trình ta đang viết vào để có thể kết nối đến địa chỉ mà Kafka server đang chạy, cũng như truy vấn theo chủ đề (topic).
Cài đặt Kafka trên Ubuntu
Cài đặt trực tiếp Kafka
Các bạn vui lòng làm theo hướng dẫn ở link sau đây: https://kafka.apache.org/quickstart
để có thể cài đặt trực tiếp Kafka vào máy.
Cài đặt Kafka với Docker
Nếu bạn đang dùng Ubuntu, bạn đọc phải cài Docker và docker-compose trước. Link tham khảo: https://minhng.info/docker/cai-dat-docker-tren-ubuntu.html
Ta có thể dựng Kafka server với Docker bằng file compose sau:
docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
restart: always # "unless-stopped" or "always"
kafka:
image: wurstmeister/kafka
ports:
- "9093:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 10.28.9.50
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
restart: always # "unless-stopped" or "always"
Sau đó tiếp tục chạy lệnh sau để chạy Kafka server:
$ docker-compose up
hoặc lệnh sau để chạy như một service trên máy:
$ docker-compose up -d
LƯU Í: điều chỉnh giá trị 10.28.9.50 thành giá trị phù hợp theo IP hoặc hostname.