+8

[Phỏng vấn Backend]: So sánh RabbitMQ vs Kafka?

I. Cơ chế push và pull

RabbitMQ sử dụng cơ chế push để gửi message đến consumer. Khi message đến, broker chủ động đẩy message về consumer. Điều này giúp giảm độ trễ trong việc xử lý message. RabbitMQ cũng có thể cấu hình để sử dụng cơ chế pull trong một số trường hợp đặc biệt. Nó có một pull API nhưng hiệu suất của nó không tốt, vì mỗi thông điệp sẽ yêu cầu một chuyến đi khứ hồi request-response.

Kafka sử dụng cơ chế pull, trong đó consumer chủ động yêu cầu dữ liệu từ broker. Consumer định kỳ gửi request đến Kafka broker để lấy message mới. Việc này giúp cho consumer có thể kiểm soát tốc độ nhận message, tránh quá tải khi xử lý một lượng lớn dữ liệu.

Sự khác biệt này ảnh hưởng đến cách mỗi hệ thống xử lý:

1. Khả năng xử lý (Throughput)

RabbitMQ:

  • Sử dụng cơ chế broker-based, broker sẽ chủ động gửi message tới các consumer có thể dẫn đến tình trạng bottleneck nếu một consumer bị quá tải hoặc không xử lý kịp.

  • Mỗi tin nhắn được đẩy vào queue và tiêu thụ bởi một consumer. Nếu bạn có nhiều consumer, RabbitMQ sẽ phân phối tin nhắn đến từng consumer một cách tuần tự. Tuy nhiên, điều này giới hạn hiệu suất ở mức mỗi queue sẽ chỉ có một node chịu trách nhiệm quản lý (trừ khi sử dụng mirrored queues).

  • Dù RabbitMQ hỗ trợ clustering, mỗi queue mặc định chỉ được lưu trữ trên một node và các tin nhắn trong queue cũng chỉ tồn tại ở node đó. Nếu bạn sử dụng mirrored queues (hàng đợi phản chiếu) để đảm bảo tính sẵn sàng cao, điều này dẫn đến việc các tin nhắn phải được sao chép qua nhiều node, gây ra overhead và làm giảm hiệu suất khi cụm mở rộng lớn. Do đó, rabbitMQ không được tối ưu hóa cho việc mở rộng trên một số lượng lớn node.

  • RabbitMQ có thể xử lý từ vài nghìn đến hàng chục nghìn tin nhắn/s trong các điều kiện tốt.

Kafka:

  • Các consumer chủ động lấy dữ liệu từ Kafka khi chúng sẵn sàng xử lý. Điều này giúp tối ưu hóa luồng dữ liệu và hạn chế tình trạng tắc nghẽn.

  • Được thiết kế ngay từ đầu là một distributed streaming platform, tối ưu hóa cho việc lưu trữ và xử lý lượng lớn dữ liệu. Các topic trong Kafka được chia thành nhiều partition, và các partition này có thể được phân phối trên nhiều node trong cluster, giúp chia tải và tăng khả năng mở rộng. Mỗi consumer trong Kafka có thể đọc dữ liệu từ các partition khác nhau, làm cho hệ thống mở rộng rất tốt khi số lượng consumer tăng.

  • Kafka có thể dễ dàng mở rộng để xử lý hàng triệu tin nhắn/s.

2. Độ trễ (Latency)

  • RabbitMQ có thể đạt được độ trễ thấp hơn trong nhiều trường hợp nhờ cơ chế push, thích hợp cho các trường hợp yêu cầu phản hồi nhanh và tin nhắn nhỏ.
  • Kafka có độ trễ cao hơn RabbitMQ, nhưng vẫn ở mức chấp nhận được

3. Tính bền vững(durable)

RabbitMQ:

  • Tin nhắn thường được tiêu thụ và xóa khỏi queue sau khi đã được xử lý.
  • Mặc dù RabbitMQ có thể lưu trữ dữ liệu trên đĩa (persistent messages), nhưng điều này không phải là thiết kế chủ đạo của nó. Khả năng lưu trữ dữ liệu lâu dài không được tối ưu hóa
  • Dead letter queue (DLQ) là một hàng đợi đặc biệt được sử dụng để chứa những tin nhắn không thể tiêu thụ thành công, chẳng hạn như khi tin nhắn hết thời gian xử lý, bị từ chối (rejected), hoặc khi hàng đợi không tìm thấy consumer. Tức là nó sẽ chỉ xử lý lại những message lỗi, không có khả năng "replay" lại dữ liệu khi cần thiết giống kafka.

Kafka:

  • Thiết kế theo mô hình log-based giúp kafka giữ lại các tin nhắn trên đĩa trong thời gian dài, và các consumer có thể quay lại để đọc lại bất kỳ thời điểm nào trong log, ngay cả sau khi tin nhắn đã được tiêu thụ. Điều này không chỉ hỗ trợ xử lý dữ liệu theo thời gian thực mà còn phù hợp cho việc phân tích dữ liệu, lưu trữ và phục hồi dữ liệu.

II. Use case sử dụng:

1. RabbitMQ

Tình huống sử dụng:

Phù hợp cho các tác vụ cần xử lý message theo thời gian thực, yêu cầu độ trễ cực thấp hoặc routing phức tạp. Ví dụ: Hệ thống chat trực tuyến, hệ thống cảnh báo tức thì, hoặc các ứng dụng gửi email. Các tin nhắn cần được xử lý ngay lập tức và gửi đến người nhận mà không cần lưu trữ lâu dài.

Giao diện:: Có giao diện quản lý web tích hợp, dễ sử dụng.

Learning Curve: Dễ học hơn, phù hợp với những người mới bắt đầu.

Chi phí: Thường dễ triển khai hơn trên quy mô nhỏ, yêu cầu phần cứng không cao bằng.

2. Kafka

Tình huống sử dụng:

Mạnh cho các ứng dụng xử lý lượng lớn dữ liệu và cần lưu trữ lại data. Ví dụ: Các ứng dụng IoT, phân tích dữ liệu (analytics), hoặc quản lý log.

Giao diện:: Cần tools bên thứ ba để quản lý và giám sát hiệu quả.

Chi phí: Thường yêu cầu nhiều tài nguyên hơn (CPU, RAM, và disk) để hoạt động hiệu quả, đặc biệt trong các hệ thống quy mô lớn. Điều này có thể làm tăng chi phí phần cứng.

Tóm lại rabbitMQ là lựa chọn lý tưởng cho các ứng dụng yêu cầu xử lý tin nhắn nhanh và không cần lưu trữ lâu dài, trong khi Kafka là sự lựa chọn tốt cho các ứng dụng cần xử lý khối lượng lớn dữ liệu và lưu trữ lâu dài.

Tham khảo

Group discord 2k+ mems: chém gió về lập trình và làm pet project cùng nhau

Ren


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.