# Apache kafka
Apache kafka là `event streaming platform` hơn cả một ``message broker``, có 4 tính chất nổi bật sau:
- **High scalable**: Kafka là hệ thống phân tán - distributed system, có khả năng mở rộng rất nhanh và dễ dàng với zero downtime - mọi thứ vẫn hoạt động bình thường khi thêm hoặc bớt broker.
- **High durable**: message được lưu trên disk, đảm bảo nếu mất điện.. data vẫn còn nguyên. Ngoài ra, một message sẽ có nhiều bản sao lưu trên nhiều broker khác nhau, phụ thuộc vào config và set up. Nếu một broker die, flow vẫn hoạt động bình thường không bị ngắt quãng.
- **High reliable**: giống durable, lưu trữ message ở nhiều nơi. Ngoài ra có cơ chế cân bằng request trong trường hợp gặp sự cố về các broker. Đại khái là đáng tin cậy hơn các message broker hiện có trên thị trường.
- **High performance**: high throughput cho cả đầu gửi và nhận message với khả năng scale tuyệt vời. Nhờ vậy nó có thể xử lý hàng TB data mà không gặp nhiều vấn đề về performance.
## Topic
Topic là `stream of data`, luồng dữ liệu của Kafka, có thể hiểu là một dãy message nối tiếp nhau.
- Có thể coi topic giống như table trong relational databse: OracleBD, PostgreSQL... whatever.
- Table bao gồm name và row. Tương tự, sẽ có topic name và message. Các luồng dữ liệu được gửi vào topic giống như việc insert row vào table. Row mới được insert vào ngay sau row cũ.
Topic được lưu trữ ở log file phân chia thành các segment khác nhau.

## Partition và offset
Topic cũng giống table, nó được chia thành một hoặc nhiều partition và message được lưu trên đó. Khi tạo topic cần xác định số lượng partition mong muốn.
- Partition được order và bắt đầu từ 0.
- Các message được lưu trong partition cũng được order theo thứ tự từ cũ đến mới, append liên tục bắt đầu từ giá trị 0, được gọi là offset.

Với ví dụ trên, cả 3 partition không có cùng số lượng message. Số lượng message của mỗi partition là độc lập, không phụ thuộc vào nhau. Như vậy, một message trong Kafka được xác định bởi 3 yếu tố:
- Topic name.
- Partition.
- Offset.
Vài điều cần chú ý:
- Dù 2 message có cùng offset nhưng thuộc 2 partition khác nhau thì chúng cũng khác nhau. Offset chỉ có ý nghĩa trong cùng một partition.
- Offset có thứ tự, nhưng chỉ đảm bảo thứ tự trong cùng partition. Ví dụ trong cùng partition 1, message có offset = 3 chắc chắn đến sau message có offset = 2.
- Kafka là Data pipeline. Message sau khi được consume không bị xóa ngay, default giữ lại trong 7 ngày - có thể config. Sau 7 ngày message bị xóa nhưng offset không reset mà tiếp tục tăng.
- Data sau khi lưu vào partition là immutable - bất biến, không thể thay đổi. Không thể update, không thể swap sang offset khác.
## Kafka broker
Message được lưu tại offset của partition, partition được lưu ở topic. Còn topic được lưu trữ trên file, trên disk, và tất cả đều được lưu trữ trên server. Và server là một Kafka broker trong Kafka cluster.
Kafka cluster là nhiều server tập trung lại thành một cụm làm việc với nhau - multi-brokers (multi-servers). Broker bao gồm 3 nhiệm vụ:
- Receive message từ Producer và ack.
- Lưu message tại log file để đảm bảo an toàn, tránh trường hợp mất message.
- Gửi message đến Consumer trong trường hợp được yêu cầu.
Ngoài lề, cluster và replicate đều nói về multi-node nhưng khái niệm và cơ chế hoạt động khác nhau.
Số lượng broker trong Kafka cluster thường là 3, 5, 7, 10... Mỗi Kafka broker được định danh bằng ID, là số nguyên integer. Mỗi broker lưu trữ một vài partition, không lưu trữ tất cả partition của topic.
Cuối cùng, khi connect đến bất kì broker nào trong mạng Kafka cluster, chúng ta sẽ connect tới toàn bộ mạng cluster đó. Không quan tâm cluster có bao nhiêu broker.
## Kafka broker & topic
Ví dụ, Kafka cluster có 3 broker. Tạo thêm Topic-A cũng chia thành 3 partition, Kafka tổ chức chúng như sau:

Để đảm bảo high reliable, Kafka tự động phân tán các partition trên tất cả broker đang có. Mỗi partition nằm trên một broker. Topic-A partition 1 có thể nằm trên bất kì broker nào mà không phụ thuộc thứ tự.
Trong trường hợp Topic-B khác có 2 partition:

Case cuối cùng, Topic-C có số lượng partition lớn hơn số lượng broker:

Không có gì phức tạp, Kafka cluster sẽ phân tán các partition của cùng một topic ra nhiều broker nhất có thể.
## Topic replication
Với cách tổ chức broker và partition như trên vẫn chưa giải quyết triệt để single-point failure.

Nếu là Broker 101 hoặc Broker 102 gặp sự cố thì sẽ ảnh hưởng. Ta sẽ tạo ra nhiều bản sao cho partition và lưu trên những broker khác nhau thông qua replication factor. Với ví dụ trên replication factor = 1. Nếu tăng lên 3, mô hình sẽ như sau:

Như vậy, chúng ta đã nắm được khái niệm cơ bản trong Apache Kafka và mối liên quan giữa Topic, partition và replication.

# Tham khảo
[Viblo](https://viblo.asia/p/002-apache-kafka-topic-partition-offset-va-broker-m68Z0eEMlkG)