**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:

```
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
---------

1. ↑  "Apache Kafka at GitHub". *github.com*. Lưu trữ bản gốc ngày 16 tháng 8 năm 2020. Truy cập ngày 5 tháng 3 năm 2018.
2. ↑  "Open-sourcing Kafka, LinkedIn's distributed message queue". *linkedin.com*. Lưu trữ bản gốc ngày 11 tháng 1 năm 2021. Truy cập ngày 27 tháng 10 năm 2016.
3. ↑  "Download". *kafka.apache.org*. Lưu trữ bản gốc ngày 27 tháng 9 năm 2021. Truy cập ngày 21 tháng 9 năm 2021.
4. ↑  Li, Steven. "He Left His High-Paying Job At LinkedIn And Then Built A $4.5 Billion Business In A Niche You've Never Heard Of". *Forbes* (bằng tiếng Anh). Lưu trữ bản gốc ngày 31 tháng 3 năm 2022. Truy cập ngày 31 tháng 3 năm 2022.
5. ↑  "What is the relation between Kafka, the writer, and Apache Kafka, the distributed messaging system?". *Quora* (bằng tiếng Anh). Lưu trữ bản gốc ngày 26 tháng 4 năm 2022. Truy cập ngày 31 tháng 3 năm 2022.
6. ↑  "Apache Kafka". *Apache Kafka* (bằng tiếng Anh). Lưu trữ bản gốc ngày 10 tháng 9 năm 2021. Truy cập ngày 26 tháng 4 năm 2022.
7. ↑  Datadog (6 tháng 4 năm 2016). "Monitoring Kafka performance metrics". *Monitoring Kafka performance metrics* (bằng tiếng Anh). Lưu trữ bản gốc ngày 8 tháng 11 năm 2020. Truy cập ngày 18 tháng 4 năm 2023.
8. ↑  "Clients - Apache Kafka - Apache Software Foundation". *cwiki.apache.org*. Lưu trữ bản gốc ngày 6 tháng 4 năm 2023. Truy cập ngày 18 tháng 4 năm 2023.

Đọc thêm
--------

* Ted Dunning, Ellen M. D. Friedman: **Streaming Architecture**. *New Designs Using Apache Kafka and MapR*. O’Reilly Verlag, Sebastopol 2016, ISBN 978-1-4919-5392-1.
* Neha Narkhede, Gwen Shapira, Todd Palino: **Kafka: The Definitive Guide**. *Real-time data and stream processing at scale*. O’Reilly Verlag, Sebastopol 2017, ISBN 978-1-4919-3616-0.
* William P. Bejeck Jr.: **Kafka Streams in Action**. *Real-time apps and microservices with the Kafka Streams API*. Manning, Shelter Island 2018, ISBN 978-1-6172-9447-1.