Apache Kafka là một nền tảng mã nguồn mở dùng để xử lý và truyền tải dữ liệu sự kiện theo thời gian thực trên nhiều máy chủ (open-source distributed event streaming platform).
> Mỗi transaction giao dịch sẽ tạo ra một event rồi gửi đến Kafka server. > + Trên ứng dụng thực tế, các transaction giao dịch có thể diễn ra đồng thời với 1 ố lượng rất lớn trong vài giây, việc này tạo ra một loạt các event gửi đến Kafka, quá trình này gọi là Create / Generate realtime event stream of data. Khi Kafka server nhận được data, nó cần phải xử lí. > + Giả sử ứng dụng có một client application có vai trò là đọc data từ Kafka và xử lí yêu cầu đặt vé máy bay và client application muốn hạn chế mỗi user chỉ được phép thực hiện 10 transaction mỗi ngày. Nếu vượt mức transaction, application sẽ send một mail thông báo đến email của user. >+ Trong trường hợp như trên, client application phải liên tục thực hiện validation kiểm tra số lượng transaction của mỗi user. Nghĩa là application phải liên tục lắng nghe Kafka Server để nhận message. Quá trình này được gọi là Processing realtime event stream of data .Giả sử chúng ta có 4 service cần giao tiếp và kết nối với 5 service/server khác nhau
![Hình ảnh Kafka](./images-note/why_need_kafka1.png) Trong trường hợp này, việc quản lí kết nối giữa các service sẽ là một bài toán khó khăn bởi vì chúng ta cần phải quan tâm đến các yếu tố sau đây đối với mỗi service: - Data Format - Connection Type - Số lượng Connection 1. Data Format: - Mỗi service có thể muốn cung cấp hoặc nhận một loại data theo format khác nhau. Rất khó khăn để handle data format và schema cho mỗi service trong trường hợp này. 2. Connection Type: - Có thể có nhiều loại kết nối (HTTP, TCP, JDBC, ...), với nhiều loại connect này sẽ rất khó để maintain giữa các service. 3. Số lượng Connection: - Nếu chúng ta nhìn nhận kĩ càng sẽ dễ dàng nhận thấy mỗi service ở sơ đồ trên hiện tại đang duy trì 5 connection đến các server đích. Tổng cộng là 20 connection. Với nhiều kết nối và phân tán ra như vậy, việc quản lý rất khó khăn. Kafka sẽ giải quyết vấn đề bằng cách tập trung chúng lại một chỗ như sau: ![Hình ảnh Kafka](./images-note/why_need_kafka2.png) Xem xét sơ đồ: + Mỗi service giờ đây sẽ không quan tâm đến data format, chúng chỉ đơn giản là gửi dữ liệu tập trung đến Kafka server. + Server đích cần loại data nào, sẽ chủ động lấy từ Kafka ra. + Số lượng connection giảm đi, giờ đây chỉ còn 9 connection. *Bao gồm 3 phần: Publisher, Subsciber, Message Broker
Giả sử chúng ta có 4 service cần giao tiếp và kết nối với 5 service/server khác nhau
![Hình ảnh Kafka](./images-note/why_need_kafka1.png) Trong trường hợp này, việc quản lí kết nối giữa các service sẽ là một bài toán khó khăn bởi vì chúng ta cần phải quan tâm đến các yếu tố sau đây đối với mỗi service: - Data Format - Connection Type - Số lượng Connection 1. Data Format: - Mỗi service có thể muốn cung cấp hoặc nhận một loại data theo format khác nhau. Rất khó khăn để handle data format và schema cho mỗi service trong trường hợp này. 2. Connection Type: - Có thể có nhiều loại kết nối (HTTP, TCP, JDBC, ...), với nhiều loại connect này sẽ rất khó để maintain giữa các service. 3. Số lượng Connection: - Nếu chúng ta nhìn nhận kĩ càng sẽ dễ dàng nhận thấy mỗi service ở sơ đồ trên hiện tại đang duy trì 5 connection đến các server đích. Tổng cộng là 20 connection. Với nhiều kết nối và phân tán ra như vậy, việc quản lý rất khó khăn. Kafka sẽ giải quyết vấn đề bằng cách tập trung chúng lại một chỗ như sau: ![Hình ảnh Kafka](./images-note/why_need_kafka2.png) Xem xét sơ đồ: + Mỗi service giờ đây sẽ không quan tâm đến data format, chúng chỉ đơn giản là gửi dữ liệu tập trung đến Kafka server. + Server đích cần loại data nào, sẽ chủ động lấy từ Kafka ra. + Số lượng connection giảm đi, giờ đây chỉ còn 9 connection.Cluster là một khái niệm quen thuộc trong thế giới Microservice, chúng là một cụm các máy chủ. Trong định nghĩa của Kafka tương tự. Bởi vì Kafka cũng là hệ thống phân tán, nó có thể có nhiều Kafka server hay Broker trong một Kafka Cluster.
Topic định nghĩa danh mục cho các message hoặc dán nhãn cho các message và từ đó, Consumer có thể nhận được các message liên quan đến Topic mà mình đã đăng ký lắng nghe.
Xem xét lại ví dụ PayTM trước đó:
![Hình ảnh Kafka](./images-note/topic1.png)Chúng ta đã biết PayTM sẽ sản sinh ra rất nhiều message đến Broker và Broker có thể lưu các message nào theo từng Topic. Giả sử lúc này đây, chúng ta có số lượng cực lớn các message, lên đến hàng triệu. Lúc này đây topic là không đủ để handle các message. Việc lưu các message trở nên bất khả thi trên một máy chủ. Do kafka là một hệ thốntg máy chủ phân tán, thế nên chúng ta có thể chia nhỏ các Topic thành nhiều phần, và phân tán mỗi phần sang một máy chủ khác. Các phần topic được gọi là các Partitions
![Hình ảnh Kafka](./images-note/partitions.png)Với việc có nhiều Partiton cho mỗi Topic, mỗi khi publisher gửi một lượng lớn message cho một topic nhất định, thì mỗi Partition trong topic chỉ việc lưu một phần message, giúp cải thiện đáng kể hiệu năng. Và kể cả khi có một partition bị down, miễn là các partition khác còn hoạt động thì cả kênh giao tiếp sẽ không bị gián đoạn.
*Đến giờ chúng ta đã nắm được:
Mỗi khi producer gửi message đến, message này sẽ nằm bên trong bất kì partition nào của một topic nhất định.
Chúng ta sẽ không kiểm soát quá trình này, quá trình này hoạt động dựa trên quy tắc xoay vòng. Mỗi khi một message được đặt vào một partion, nó sẽ được gắn một số để định danh vị trí được gọi là offset. Các số này là một dãy liên tục tăng.
Vai trò của offset là sẽ giúp chúng ta biết được message nào đã được consume bởi consumer.
![Hình ảnh Kafka](./images-note/offset1.png)Lấy ví dụ:
Đến giờ chúng ta đã nắm được:
Với kiến trúc hiện tại, mỗi một consumer phải lắng nghe tất cả partition để đảm bảo lấy được message cần thiết. Điều này là không tối ưu vì không có tính tuần tự.
![Hình ảnh Kafka](./images-note/consumer1.png)Giải quyết vấn đề này, chúng ta sẽ chia nhỏ workload, cụ thể là:
Lưu ý: Chúng ta không thể đảm bảo thứ tự của consumer và partion, bất kì consumer nào cũng có thể lắng nghe đến bất kì partiton nào. Việc này sẽ được quyết định bởi Coordinator
Chúng ta đã có 3 consumer lắng nghe đến 3 partion khác nhau, vậy trong trường hợp có consumer thứ 4?
![Hình ảnh Kafka](./images-note/consumer3.png)Không thay đổi! Consumer thứ 4 sẽ idle bởi vì tất cả các partion đều đã được lắng nghe và không còn partiton nào cho Consumer này. Nhưng trong trường hợp có bất kì Consumer nào reject hoặc offline, thì Consumer thứ 4 sẽ có cơ hội connect.
Khái niệm này được gọi là Consumer Rebalancing.