NguyenAnh.net

Kafka và RabbitMQ

May 30, 2019 • ☕️ 6 min read

Các thành phần và cơ chế hoạt động

Kafka

  1. Consumer / Consumer groups
  2. Producer
  3. Kafka source connect
  4. Kafka sink connect
  5. Topic and topic partition
  6. Kafka stream
  7. Broker
  8. Zookeeper

Kafka là một hệ thống mạnh mẽ bao gồm nhiều thành phần nhưng khi đã hiểu luồng hoạt động, bạn rất dễ để quản lý và làm việc với nó.

Consumer gửi một bản ghi thông điệp đến một topic (topic là một chủ đề bao gồm các bản ghi được phát hành (published)), nó có thể được phân vùng để có hiệu năng tốt nhất. Các consumer theo dõi (subscribe) một topic và bắt đầu nhận thông điệp từ nó. Khi một topic được phân vùng thì mỗi vùng sẽ có một thể hiện consumer riêng. Các thể hiện trên cùng một consumer được gọi là một consumer group.

Trong Kafka, các thông điệp luôn được lưu trữ trong topic mặc dù chúng đã được thu nhận với thời gian giới hạn theo chính sách định nghĩa trong hệ thống.

Ngoài ra, Kafka sử dụng truy cập tuần tự giúp tăng hiệu suất của Kafka, khiến Kafka là lựa chọn hàng đầu trong việc thực thi hàng đợi và cũng là một lựa chọn an toàn trong trường hợp phải xử lý với dữ liệu lớn.

RabbitMQ

  1. Consumer
  2. Publisher
  3. Exchange
  4. Route

Luồng xử lý bắt đầu từ Publisher, thông điệp được gửi đến Exchange. Exchange là một lớp middleware giúp điều hướng thông điệp đến hàng đợi (queue). RabbitMQ đẩy một thông điệp đến consumer, và một khi đã được consume và thông điệp đã đến nơi, thông điệp sẽ bị xóa khỏi hàng đợi. Mọi thành phần trong hệ thống để có thể mở rộng: Producer, Consumer, và bản thân RabbitMQ có thể cluster và có tính sẵn sàng cao.

So sánh

Phân tán và song song

Cả hai đều là giải pháp phân tán tốt, nhưng Kafka và RabbitMQ có một số điểm khác biệt.

RabbitMQ có thể mở rộng về số lượng các consumer, có nghĩa là với mỗi thể hiện của hàng đợi, bạn có thể có nhiều consumer.

Tính sẵn sàng cao (highly available)

Cả hai giải pháp đều có tính sẵn sàng cao, nhưng có vẻ Kafka tiến nhanh hơn một bước bằng việc sử dụng Zookeeper để quản lý trạng thái của các cụm (cluster).

Hiệu năng

Kafka tận dụng sức manghj của truy xuất tuần tự I/O và yêu cầu ít phần cứng hơn. Việc này giúp đáp ứng được thông lượng cao: hàng triệu thông điệp mỗi giây với số lượng node nhỏ hơn.

RabbitMQ cũng có thể xử lý hàng triệu thông điệp mỗi giây nhưng yêu cầu hơn 30 nodes.

Replication

Theo thiết kế, Kafka tự động nhân bản các broker. Khi broker chính (master broker) ngưng hoạt động, tất cả xử lý sẽ tự động chuyển qua broker khác là bản sao đầy đủ của broker ngưng hoạt động. Khi đó, các thông điệp được giữ nguyên vẹn.

Trong hàng đợi RabbitMQ không có cơ chế tự động nhân bản, ta cần phải cấu hình thủ công.

Đa subscriber

Trong Kafka, thông điệp có thể được đăng ký bởi nhiều consumer.

Còn với RabbitMQ, thông được chỉ được đăng ký bởi 1 consumer. Và khi đã consume, thông điệp sẽ biến mất và không thể truy cập được nữa.

Thứ tự thông điệp

Kafka phân vùng thông điệp nên bạn có thể lấy thứ tự thông điệp. Thông điệp được điều hướng đến các chủ đề bởi khóa thông điệp, do vậy khi chọn đúng khóa, bạn có thể lấy được chủ đề cho vất cứ khóa nào với các thông điệp đã được sắp xếp. Điều tương tự không thể làm được trong RabbitMQ. Ta chỉ có thể bắt trước bằng cách định nghĩa nhiều hàng đợi và gửi mỗi thông điệp đến các hàng đợi khác nhau. Khi mở rộng, việc này có thể gây ra nhiều khó khăn.

Compaction log: Nếu thông điệp cùng khóa trở lại nhiều lần thì Kafka chỉ lưu giá trị cuối cùng trong log và xóa các thông điệp cũ.

Giao thức thông điệp

RabbitMQ chỉ hỗ trợ các giao thức hàng đợi chuẩn như AMQP, STOMP (Text based), MQTT (lightweight publish/subscribe messaging) và HTTP trong khi Kafka hỗ trợ thông điệp primitive (int8, int16, int32, int64, string, arrays) và thông điệp binary.

Message lifetime

Because Kafka is a log, messages are always there, you can control this by defining a message retention policy. RabbitMQ is a queue, messages removed once consumed and acknowledgment arrived.

In RabbitMQ you can configure messages to be persistent, mark the queue as durable and messages as persistent, From the docs: The persistence guarantees aren’t strong

Xác nhận thông điệp

Trong cả 2 giải pháp, producer nhận xác nhận rằng thông điệp đã đến hàng đợi/chủ đề và chỉ consumer gửi một xác nhận khi thông điệp đã được consume thành công. Do vậy bạn có thể đảm bảo rằng thông điệp không bị mất bằng cách nào đó.

Định tuyến linh hoạt đến hàng đợi/ chủ đề

Thông điệp trong Kafka được gửi đến chủ đề bởi khóa, còn trong RabbitMQ thì có nhiều lựa chọn hơn, ví dụ bởi biểu thức chính quy, wildcard.

Ưu tiên thông điệp

Trong RabbitMQ, bạn có thể định nghĩa mức ưu tiên cho thông điệp và thu nhận thông điệp có mức ưu tiên cao hơn trước. Việc này khó thực hiện trong Kafka (có thể thực thiện theo khóa thông điệp nhưng khi mở rộng, việc này có thể khó khăn hơn)

Theo dõi

Với Kafka, có 3 công cụ theo dõi

Trả phí

Miễn phí

RabbitMQ cung cấp sẵn công cụ quản lý thông qua giao diện web

Hỗ trợ giao dịch

Cả hai hỗ trợ atomic write, có nghĩa là khi ghi một loạt thông điệp vào hàng đợi và một trong số chúng thất bại, tất cả các giao dịch sẽ được hủy bỏ. Việc này được sử dụng thường xuyên khi xử lý stream trong Kafka.