Tìm hiểu về Kafka? Ứng dụng Kafka cho hệ thống message

Kafka là gì?

Đó là hệ thống message pub/sub phân tán (distributed messaging system). Bên pulbic dữ liệu được gọi là producer, bên subscribe nhận dữ liệu theo topic được gọi là consumer.

Kafka có khả năng truyền một lượng lớn message theo thời gian thực, trong trường hợp bên nhận chưa nhận message vẫn được lưu trữ sao lưu trên một hàng đợi và cả trên ổ đĩa bảo đảm an toàn. Đồng thời nó cũng được replicate trong cluster giúp phòng tránh mất dữ liệu.

Đặc điểm này của Kakfa thường được gắn liền với đặc điểm là “persistence”“durable”.

Cấu trúc Kafka đơn giản

Các thuật ngữ trong Kakfa

PRODUCER: Kafka lưu, phân loại message theo topic, sử dụng producer để publish message vào các topic. Dữ liệu được gửi đển partition của topic lưu trữ trên Broker.

CONSUMER: Kafka sử dụng consumer để subscribe vào topic, các consumer được định danh bằng các group name. Nhiều consumer có thể cùng đọc một topic.

TOPIC: Dữ liệu truyền trong Kafka theo topic, khi cần truyền dữ liệu cho các ứng dụng khác nhau thì sẽ tạo ra các topic khác nhau.

PARTITION: Đây là nơi dữ liệu cho một topic được lưu trữ. Một topic có thể có một hay nhiều partition. Trên mỗi partition thì dữ liệu lưu trữ cố định và được gán cho một ID gọi là offset. Trong một Kafka cluster thì một partition có thể replicate (sao chép) ra nhiều bản. Trong đó có một bản leader chịu trách nhiệm đọc ghi dữ liệu và các bản còn lại gọi là follower. Khi bản leader bị lỗi thì sẽ có một bản follower lên làm leader thay thế. Nếu muốn dùng nhiều consumer đọc song song dữ liệu của một topic thì topic đó cần phải có nhiều partition.

BROKER: Kafka cluster là một tập hợp nhiều broker, các broker hoạt động song song với nhau để quản lý dữ liệu vào ra. Các broker hoạt động ngang hàng với nhau và được quản lý bởi Zookeeper.

ZOOKEEPER: được dùng để quản lý và bố trí các broker. Có thể nói ZooKeeper hạt động như 1 “distributed coordination”. VD Client A ghi dữ liệu thì ngay lập tức Client B khác có thể nhìn thấy thay đổi ấy, điều này rất quan trọng trong môi trường phân tán, khi tìm hiểu về HA của Hdfs hay Yarn, các bạn cũng sẽ thấy các nội dung về ZooKeeper.

Đơn vị quản lý dữ liệu của ZK là node, bản thân 1 node có thể chứa cả dữ liệu và các node con bên trong.

Toàn bộ thông tin về topicpartitions của 1 cluster đều được lưu trên ZK, đó là lý do tại sao khi cài Kafka bạn luôn được yêu cầu cài đặt ZK, mặt định, node ZK được sử dụng để lưu thông tin về cụm Kafka là /brokers, trong đây sẽ chứa thông tin về id của Broker, các topics và partitons.

Cáu trúc Kafka chi tiết

Thêm vào đó, thông tin Leader của các partition cũng được lưu trữ trên Zookeeper, Khi có sự kiện thêm hoặc mất broker, thông tin trên ZK sẽ giúp toàn bộ các broker còn lại biết được hiện trạng của cụm để có những điều chỉnh phù hợp về leader.

Message và Batch

Đơn vị dữ liệu trong Kafka được gọi là message .Nếu bạn tiếp cận Kafka từ góc nhìn của nền tảng cơ sở dữ liệu, bạn có thể nghĩ về message tương tự như một row hoặc một record.

Một message chỉ đơn giản là một mảng byte , vì vậy dữ liệu chứa trong đó không có định dạng cụ thể hoặc ý nghĩa . Một message có thể có một tùy chọn bit of metadata, được gọi là một khóa ( nghĩa là cái bit này là khóa của metadata :v ). Khóa này cũng là một mảng byte và cũng giống như message nó không có ý nghĩa cụ thể nào cả.

Các key được sử dụng khi message được ghi vào các phân vùng khác nhau một cách dễ kiểm soát hơn. Đơn giản nhất là tạo ra một hàm băm nhất quán của key và sau đó cho vào phân vùng có số là kết quả sau khi băm của key. Điều này đảm bảo rằng các tin nhắn có cùng khóa luôn được ghi vào các vùng giống nhau.

Để hiệu quả, message được viết vào Kafka theo đợt( Batches ). batch chỉ là một tập hợp các message, tất cả chúng đang được tạo ra cho cùng một topic ( chủ đề ) và partition ( phân vùng) .Cứ mỗi message mà cứ chạy riêng lẻ trên mạng thì chi phí quá cao vì thế việc gộp các message này thành một lô ( Batches ) làm giảm thiểu chi phí này. Tất nhiên, đây là sự đánh đổi giữa độ trễ và thông lượng ,cũng chỉ là 2 mặt của một đồng xu thôi các lô càng lớn càng nhiều message sẽ phải đợi cho đủ lô mới đc gửi như thế độ trễ sẽ lớn. Các lô cũng thường được nén vì vậy cung cấp khả năng truyền và lưu trữ dữ liệu hiệu quả hơn.

Ngoài ra, Kafka broker có thể xử lý các tin nhắn lên đến 1MB (trên thực tế, ít hơn 1MB một chút) với cài đặt cấu hình mặc định, mặc dù Kafka được tối ưu hóa cho các tin nhắn nhỏ có kích thước khoảng 1K. Cài đặt cấu hình cho message broker và topic cho các thông báo lớn hơn không nằm trong phạm vi của bài viết này.

Stream

Stream là thuật ngữ thường được sử dụng khi nói về dữ liệu trong các hệ thống như Kafka. Thông thường, một stream được coi là một single topic của dữ liệu, bất kể số lượng phân vùng trong topic. Điều này thể hiện một stream dữ liệu duy nhất chuyển từ producers sang consumers. Cách đề cập đến các message này là khá phổ biến khi miêu tả việc xử lý củastream, đó là khi một số framework như Kafka Streams, Apache Samza và Storm, hoạt động trên các message theo thời gian thực.

Tại sao Kafka lại nhanh đến như vậy?

Kafka phụ thuộc rất nhiều vào nhân hệ điều hành để di chuyển dữ liệu một cách nhanh chóng. Nó dựa vào các nguyên tắc của Zero Copy . Kafka cho phép chúng ta sắp xếp các bản ghi dữ liệu thành các khối. Các khối dữ liệu này có thể được nhìn thấy từ đầu đến cuối từ Producer đến hệ thống tệp (Kafka Topic Log) cho Consumer. Batching cho phép nén dữ liệu hiệu quả hơn và giảm độ trễ I / O.

Kafka tránh sao chép bộ đệm trong bộ nhớ và truyền dữ liệu vào nhật ký bất biến(offset) thay vì sử dụng truy cập ngẫu nhiên, chính điều này làm cho kafka nhanh đến vậy.

Một vài use case cho kafka

  • Sử dụng như một hệ thống message queue thay thế cho ActiveMQ hay RabbitMQ
  • Website Activity Monitoring: theo dõi hoạt động của website
  • Stream Processing: Kafka là một hệ thống rất thích hợp cho việc xử lý dòng dữ liệu trong thời gian thực. Khi dữ liệu của một topic được thêm mới ngay lập tức được ghi vào hệ thống và truyền đến cho bên nhận. Ngoài ra Kafka  còn là một hệ thống có đặc tính duribility dữ liệu có thể được lưu trữ an toàn cho đến khi bên nhận sẵn sàng nhận nó.
  • Log Aggregation: tổng hợp log
  • Metrics Collection: thu thập dữ liệu, tracking hành động người dùng như các thông số như page view, search action của user sẽ được publish vào một topic và sẽ được xử lý sau
  • Event-Sourcing: Lưu lại trạng thái của hệ thống để có thể tái hiện trong trường hợp system bị down.

Use case Kafka cho thương mại điện tử

Một hệ thống thương mại điện tử có nhiều server thực hiện các tác vụ khác nhau. Tất cả các server này đều sẽ giao tiếp với database server để đọc ghi dữ liệu.

Vì vậy sẽ có rất nhiều data pipeline kết nối từ rất nhiều server khác đến database server này. Cơ cấu như sau:

Nhìn đơn giản vậy thôi chứ đây là hệ thống nhỏ, đối với hệ thống lớn hơn thì nó sẽ như vầy:

Lúc này data pipeline sẽ phức tạp khủng khiếp do gia tăng lượng hệ thống server. Lúc này nếu ta sử dụng Kafka tách rời các data pipeline giữa các hệ thống để làm cho việc giao tiếp giữa các hệ thống trở nên đơn giản hơn và dễ quản lý hơn.

Use case sử dụng Kafka cho IoT

Các cảm biến IoT thu thập dữ liệu, tuy nhiên do các thiết bị này không đủ mạnh để tích hợp các stack ngăn xếp TCP mạng nên chúng sử dụng các giao thức như Z-Wave hay Zigbee để gửi dữ liệu đến một GW trung tâm có khả năng tổng hợp dữ liệu và chuyển kết nối đến hệ thống Kafka.

Các cụm dữ liệu này có thể chuyển đến cụm Apache Storm và Apache Spark để xử lý dữ liệu gần thời gian thực.

Kafka vs Rabbit MQ

Kafka cung cấp hiệu suất cao hơn nhiều so với các nhà môi giới tin nhắn như RabbitMQ. Nó sử dụng I / O đĩa tuần tự để tăng hiệu suất, làm cho nó trở thành một tùy chọn phù hợp để triển khai các hàng đợi. Nó có thể đạt được thông lượng cao (hàng triệu tin nhắn mỗi giây) với tài nguyên hạn chế, một điều cần thiết cho các trường hợp sử dụng dữ liệu lớn.

Tham khảo:

https://viblo.asia/p/kafka-nhung-khai-niem-dau-tien-RQqKLPMNK7z

Leave a Reply

Your email address will not be published. Required fields are marked *