Một tư duy khác

Nếu như ưu điểm của các message queue như RabbitMQ hay ActiveMQ nằm ở khả năng điều phối, quản lý và đảm bảo thứ tự cho các message thì nó cũng phải đánh đổi lại bằng dung lượng bộ nhớ và một ít hiệu năng, vậy bây giờ đối với những bài toán mà không cần quan tâm điếm thứ tự của message, các bài toán đòi hỏi khả năng gửi nhận dữ liệu cực lớn như bài toán lưu log thì sao? Rõ ràng là RabbitMQ hay ActiveMQ sẽ không thể đáp ứng được, đó là khi Kafka ra đời.

Giới thiệu

Kafka là một trong những framework do LinkedIn phát triển do nhu cầu kết nối hệ thống của họ. Do tính chất là một công ty cung cấp mạng xã hội việc làm lớn nhất thế giới hiện nay, hàng ngày có đến hàng trăm triệu, hàng tỉ lượt truy cập thì khối lượng dữ liệu trao đổi trong hệ thống là cực kì lớn, tuy nhiên phần lớn những dữ liệu của người dùng đều là những dữ liệu dạng log, tức là những dữ liệu không đòi hỏi phải cập nhật theo thứ tự hay phải quản lý phiên bản (tính chât ACID), nên Kafka rất phù hợp. Hiện tại thì Kafka đang được tiếp tục duy trì và phát triển bởi tổ chức Apache.

Kafka có gì?

Hết phần giới thiệu hơi nhàm chán thì bây giờ đến phần thú vị nhất và được mọi người quan tâm nhất đây. Vậy kafka có gì mà hay ho vậy? Kafka khác biệt với các MQ 4 điểm chính sau:

  1. Kafka broker không lưu message ở bộ nhớ (RAM) mà lưu xuống file, đây là điểm nhấn rất mạnh của kafka, nó đảm bảo rằng chỉ với một vài GB RAM bạn cũng có thể lưu bao nhiêu message cũng được với dung lượng ổ đĩa có thể lên đến hàng TB, điều này giúp cho mọi dữ liệu từ rất nhiều nguồn (producer) có thể gửi đến Broker mà không bị từ chối
  2. Broker không ngay lập tức gửi dữ liệu đến consumer mà do consumer chủ động gọi đến Broker để lấy dữ liệu, điều này giúp cho dữ liệu được ghi bền ở broker mà không sợ bị mất đi ngay cả khi broker bị die
  3. Consumer không lấy từng message mà lấy hết tất cả dữ liệu được lưu trong file ở dạng byte[], điều này giúp cho Kafka broker không phải tốn CPU để deserialize và serialize dữ liệu, chúng ta gọi nó là cơ chế Zero Copy Zero ở đây nghĩa là không mất nhiều chi phí cho CPU
  4. Kafka thường đi cùng với Zookeeper, chúng ta có thể sử dụng luôn Zookeeper để làm HA cho hệ thống mà không cần dùng thêm bất cứ dịch vụ nào

Nhược điểm

Mọi thứ đều có 2 mặt của vấn đề và Kafka cũng vậy, nó cũng có một số nhược điểm:

  1. Nói gì thì nói việc đọc ghi dữ liệu từ file không thể nào nhanh bằng truy cập trên bộ nhớ (RAM) được, nên nếu sử dụng những nghiệp vụ giống với MQ sẽ có thể cho kết quả chậm hơn
  2. Việc đảm bảo thứ tự của message là tương đối khó khăn và thực lòng mình nghĩ không nên làm như vậy

Kafka phù hợp với?

Theo kinh nghiệm sử dụng của mình thì kafka phù hợp với:

  1. Các hệ thống log mà hiện nay tiêu biểu nhất là hệ thống ELK
  2. Các hệ thống không đòi hỏi tốc độ quá cao, ví dụ các hệ thống báo cáo hoặc đồng bộ dữ liệu
  3. Mình cũng đã từng thấy một công ty sử dụng cho hệ thống chat realtime của họ

Một sự hiểu nhầm

Chắc hẳn nhiều bạn ở đây đã đọc nhiều tài liệu hay blog và họ hay dùng từ stream dữ liệu đúng không? Và rất nhiều bạn nhầm nó với hệ thống livestreaming video, nhưng rất tiếc là không phải vậy, stream ở đây ý là việc gửi nhận dữ liệu ở dạng byte array mà không phải serialize hay deserialize gì hết, còn các hệ thống media live streaming thường dùng UDP thì mới đảm bảo được tốc độ khung hình trên giây được.

Tổng kết

Nhìn chung kafa phù hợp cho rất nhiều bàn toán hơn so với các MQ khác, nên hiện nay rất nhiều công ty hay tập đoàn sử dụng Kafka là chủ yếu, còn các nghiệp vụ cần gọi RPC ghì có thể dùng gRPC cũng là một lựa chọn hợp lý, tuy nhiên ngoài các hệ thống thu thập log ra thì MQ theo mình vẫn là phù hợp

Tham khảo

  1. Wiki
  2. ACID
  3. Zero Copy