Apache Kafka

**Apache Kafka** là một nền tảng theo kiến trúc phân tán cho phép lưu trữ sự kiện và xử lý dữ liệu luồng (streaming) mã nguồn mở được phát triển bởi Apache Software Foundation được viết bằng Java và Scala.

## Lịch sử
Kafka ban đầu được phát triển bởi LinkedIn và sau đó được mở nguồn vào đầu năm 2011. Jay Kreps, Neha Narkhede và Jun Rao là các đồng sáng lập nền tảng phần mềm Kafka. Xuất phát từ dự án Apache Incubator vào ngày 23 tháng 10 năm 2012, phần mềm được Jay Kreps đặt tên theo tên nhà văn Franz Kafka vì theo anh nó là "một hệ thống được tối ưu hóa cho việc viết", và anh rất thích các tác phẩm của Kafka.

Nhiều hệ thống ứng dụng xuất bản dữ liệu số lượng lớn hoặc ứng dụng thời gian thực đã sử dụng Kafka, ví dụ quản lý đối sánh hành khách và tài xế tại Uber, nhiều dịch vụ thời gian thực trên toàn bộ LinkedIn.

## Kiến trúc
Kafka lưu trữ các gói tin dạng cặp khóa-giá trị gửi đến từ nhiều tiến trình được gọi là *producer*. Dữ liệu có thể được phân hoạch thành các "phân vùng" (partition) trong các "chủ đề" (topic) khác nhau. Trong một *phân vùng*, các gói tin được sắp xếp theo thứ tự nghiêm ngặt của chúng (vị trí của một gói tin trong một phân vùng), được lập chỉ mục và lưu trữ cùng với một mốc thời gian. Các tiến trình khác được gọi là *consumer* có thể đọc tin nhắn từ các *phân vùng*. Để xử lý dữ liệu luồng stream, Kafka cung cấp Stream API cho phép viết các ứng dụng Java sử dụng dữ liệu từ Kafka và ghi kết quả trở lại Kafka. Apache Kafka cũng hoạt động với các hệ thống xử lý dữ liệu luồng (stream processing system) khác bên ngoài như Apache Apex, Apache Flink, Apache Spark, Apache Storm hay Apache NiFi.

Kafka chạy trên một cụm gồm một hoặc nhiều máy chủ (được gọi là *broker*) và các partition của tất cả các topic được phân phối trên các nút trong cụm máy chủ. Ngoài ra, các phân vùng được sao chép cho nhiều broker. Kiến trúc này cho phép Kafka truyền tải các luồng thông điệp khổng lồ theo phương thức truyền tải an toàn, có khả năng chịu lỗi và cho phép nó thay thế một số hệ thống truyền tin thông thường như Java Message Service (JMS), Advanced Message Queueing Protocol (AMQP), v.v. Kể từ phiên bản 0.11.0.0, Kafka cung cấp tính năng ghi phiên giao dịch (*transactional writes*), cho phép xử lý dữ liệu luồng chính xác một lần bằng cách sử dụng streams API.

Có năm API chính trong Kafka bao gồm:

* **Producer API** - Cho phép ứng dụng xuất bản các luồng bản ghi.
* **Consumer API** - Cho phép ứng dụng đăng ký các topic và xử lý các bản ghi luồng dữ liệu.
* **Connector API** - Thực thi các consumer và producer API cho phép liên kết các topic với các ứng dụng sẵn có.
* **Streams API** - API này chuyển đổi các dữ liệu luồng đầu vào thành đầu ra và tạo ra kết quả.
* **Admin API** - được sử dụng để quản lý các topic, broker, và các đối tượng Kafka khác.

Các consumer và producer API xây dựng dựa trên giao thức truyền tin của Kafka và cung cấp triển khai tham chiếu cho các ứng dụng khách consumer và producer client xây dựng trên Java. Giao thức truyền tin cơ bản là một giao thức dạng nhị phân (binary protocol) mà các nhà phát triển có thể sử dụng để viết các ứng dụng consumer và producer client của riêng họ trên bất kỳ ngôn ngữ lập trình nào. Điều này cho phép Kafka thoát khỏi việc phụ thuộc vào hệ sinh thái Máy ảo Java (JVM).

## Ngôn ngữ lập trình
Kafka hỗ trợ nhiều ngôn ngữ lập trình phía client như: 

* C/C++
* Python
* Go (hay golang)
* Erlang
* PowerShell
* .NET
* Clojure
* Ruby
* Node.js
* Perl
* PHP
* Rust
* Java
* Storm
* Scala DSL 
* Clojure
* Swift

Ví dụ code client sử dụng Kafka trên Python:
```python
from kafka import KafkaProducer, KafkaConsumer
import json

# Define Kafka producer configuration
producer = KafkaProducer(bootstrap_servers=['localhost:9092'],
                         value_serializer=lambda x: json.dumps(x).encode('utf-8'))

# Define Kafka consumer configuration
consumer = KafkaConsumer('my-topic', bootstrap_servers=['localhost:9092'],
                         auto_offset_reset='earliest',
                         enable_auto_commit=True,
                         group_id='my-group',
                         value_deserializer=lambda x: json.loads(x.decode('utf-8')))

# Produce message to Kafka topic
producer.send('my-topic', {'key': 'value'})

# Consume messages from Kafka topic
for message in consumer:
    print(message.value)
```


## Xem thêm

* Redis
* RabbitMQ
* Apache Spark

## Liên kết ngoài

* Trang chủ Apache Kafka

## Tham khảo

## Đọc thêm
* 
* 
*