Tại sao Kafka lại nhanh tới vậy?

Kafka được thiết kế để hỗ trợ một nền tảng thông lượng cao (throughput), phân tán (distributed), có khả năng chịu lỗi (fault-tolerant) với việc phân phối thông điệp có độ trễ thấp. Vậy Kafka được thiết kế như thế nào để đạt được độ trễ thấp như vậy?
Hãy cùng tìm hiểu những cơ chế then chốt giúp Kafka đạt được hiệu suất ấn tượng này.
Batch Data và Compression#
Tin nhắn trong Kafka có thể được xử lý theo batch – tức là nhóm nhiều tin nhắn lại thành một đơn vị truyền tải duy nhất. Việc này mang lại hai lợi ích rõ rệt:
Giảm overhead của từng lần gửi: Thay vì phải xử lý từng tin nhắn riêng lẻ, Kafka xử lý một lô tin nhắn cùng lúc, giảm thiểu chi phí giao tiếp và xử lý.
Nén dữ liệu hiệu quả: Khi dữ liệu được gom nhóm, Kafka có thể áp dụng các thuật toán nén (như gzip, snappy, lz4, zstd) để giảm kích thước dữ liệu truyền tải, tiết kiệm băng thông mạng và tăng thông lượng.
Ví dụ: thay vì gửi 1000 tin nhắn riêng lẻ, Kafka gom chúng thành một batch, nén lại và gửi đi một lần. Điều này đặc biệt quan trọng khi dữ liệu cần truyền qua mạng hoặc lưu trữ lâu dài.
Horizontally Scaling#
Kafka được thiết kế để mở rộng theo chiều ngang (scale horizontally). Mỗi topic có thể được chia thành nhiều partition, và mỗi partition có thể được đặt trên một máy chủ (broker) khác nhau. Điều này cho phép:
Xử lý song song: Các partition có thể được đọc và ghi đồng thời bởi nhiều producer và consumer.
Không bị giới hạn bởi hiệu năng của một máy đơn lẻ: Khi tải tăng, ta chỉ cần thêm broker mới và phân bổ lại partition.
Tính sẵn sàng cao: Dữ liệu được sao chép (replicate) trên nhiều broker, đảm bảo hệ thống vẫn hoạt động ngay cả khi một số node gặp sự cố.
Kiến trúc phân tán này giúp Kafka dễ dàng mở rộng để đáp ứng khối lượng dữ liệu khổng lồ.
Sequential I/O và Log-Structured Storage#
Khác với nhiều hệ thống lưu trữ dữ liệu truyền thống sử dụng bộ nhớ RAM để đạt độ trễ thấp (nhưng đắt đỏ và giới hạn dung lượng), Kafka chủ yếu lưu trữ dữ liệu trên đĩa cứng (disk). Tuy nhiên, Kafka tối ưu hóa việc đọc/ghi đĩa bằng hai kỹ thuật then chốt:

Sequential I/O#
Kafka lưu trữ dữ liệu dưới dạng append-only log – tin nhắn mới chỉ được ghi thêm vào cuối file, không ghi đè lên dữ liệu cũ. Việc đọc/ghi tuần tự (sequential) nhanh hơn rất nhiều so với đọc/ghi ngẫu nhiên (random) trên đĩa cơ học (HDD) và cả trên SSD. Nhờ đó, Kafka có thể đạt thông lượng đọc/ghi rất cao mà vẫn giữ độ trễ thấp.
Index Sparse#
Để tìm kiếm tin nhắn nhanh chóng, Kafka sử dụng index dạng sparse (thưa) – chỉ lưu một số offset nhất định, từ đó tìm kiếm nhảy cóc thay vì quét toàn bộ file. Điều này giúp giảm thời gian truy vấn mà vẫn tiết kiệm bộ nhớ.
Zero Copy Principle#
Trong kiến trúc truyền thống, khi ứng dụng muốn gửi dữ liệu từ đĩa qua mạng, dữ liệu phải trải qua nhiều bước sao chép giữa kernel space và user space, gây lãng phí CPU và tăng độ trễ.
Quy trình truyền thống:
Đọc dữ liệu từ đĩa vào kernel buffer.
Sao chép từ kernel buffer vào user buffer (ứng dụng đọc).
Sao chép từ user buffer vào kernel socket buffer.
Gửi từ socket buffer ra mạng.

Kafka sử dụng cơ chế Zero Copy (thông qua lệnh sendfile của hệ điều hành) để loại bỏ các bước sao chép không cần thiết. Dữ liệu được chuyển trực tiếp từ kernel buffer (nơi lưu dữ liệu đọc từ đĩa) đến socket buffer, giảm số lần sao chép từ 4 xuống còn 2 (hoặc thậm chí 1 nếu hệ điều hành hỗ trợ). Điều này giảm đáng kể CPU usage và tăng tốc độ truyền tải.
Các tối ưu hóa khác#
Tách biệt đọc/ghi#
Kafka cho phép đọc và ghi diễn ra đồng thời mà không ảnh hưởng lẫn nhau nhờ cấu trúc log bất biến (immutable). Producer chỉ ghi thêm vào cuối log, consumer có thể đọc độc lập ở bất kỳ vị trí nào.
Cache hiệu quả#
Hệ điều hành có thể cache dữ liệu đã đọc từ đĩa vào page cache, giúp các lần đọc sau cực nhanh. Kafka tận dụng triệt để cơ chế này, biến đĩa cứng thành một "bộ nhớ cache dung lượng lớn".
Nén đầu cuối (End-to-end compression)#
Kafka hỗ trợ nén dữ liệu ngay từ producer và giải nén tại consumer, giảm tải cho broker và mạng.
Ghi song song (Parallel Writes)#
Với nhiều partition, producer có thể ghi đồng thời vào nhiều partition khác nhau, tận dụng tối đa băng thông đĩa và mạng.
Kết luận#
Kafka đạt được hiệu suất cao nhờ sự kết hợp của nhiều kỹ thuật tối ưu:
Batch và nén để giảm overhead.
Kiến trúc phân tán để mở rộng ngang.
Đọc/ghi tuần tự và Zero Copy để tận dụng tối đa tốc độ đĩa và giảm sao chép dư thừa.
Các tối ưu bổ sung như index sparse, tách biệt đọc/ghi, và cache.
Những thiết kế này không chỉ giúp Kafka xử lý hàng triệu tin nhắn mỗi giây mà còn duy trì độ trễ thấp, biến nó thành lựa chọn hàng đầu cho các hệ thống xử lý luồng dữ liệu quy mô lớn.