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 JavaScala.

Apache Kafka[1]
Thiết kế bởiLinkedIn
Phát triển bởiApache Software Foundation
Phát hành lần đầutháng 1 năm 2011; 13 năm trước (2011-01)[2]
Phiên bản ổn định
3.1.0 / 24 tháng 1 năm 2022; 2 năm trước (2022-01-24)[3]
Kho mã nguồn
Viết bằngScala, Java
Hệ điều hànhCross-platform
Thể loạiStream processing, Message broker
Giấy phépApache License 2.0
Websitekafka.apache.org

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.[4] 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.[5]

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.[6]

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).[7]

Ngôn ngữ lập trình

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


Ví dụ code client sử dụng Kafka trên Python:

from kafka import KafkaProducer, KafkaConsumerimport json# Define Kafka producer configurationproducer = KafkaProducer(bootstrap_servers=['localhost:9092'],                         value_serializer=lambda x: json.dumps(x).encode('utf-8'))# Define Kafka consumer configurationconsumer = 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 topicproducer.send('my-topic', {'key': 'value'})# Consume messages from Kafka topicfor message in consumer:    print(message.value)

Xem thêm

  • Redis
  • RabbitMQ
  • Apache Spark

Liên kết ngoài

Tham khảo

Đọ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.