Sự khác biệt giữa Redis và Kafka [đóng]


87

Redis có thể được sử dụng như một pub-sub thời gian thực giống như Kafka.

Tôi bối rối nên sử dụng cái nào khi nào.

Bất kỳ trường hợp sử dụng sẽ là một sự trợ giúp tuyệt vời.


15
Tôi không rõ tại sao câu hỏi này lại bị đóng là "dựa trên ý kiến"? Có những khác biệt khách quan về kỹ thuật giữa hai phương pháp này và câu trả lời hiện có nêu rõ những khác biệt đó.
David Anderson

Câu trả lời:


137

Redis pub-sub phần lớn giống như một hệ thống cứu hỏa và quên, nơi tất cả các thông điệp bạn tạo ra sẽ được gửi đến tất cả người tiêu dùng cùng một lúc và dữ liệu không được lưu giữ ở đâu. Bạn có giới hạn về trí nhớ đối với Redis. Ngoài ra, số lượng nhà sản xuất và người tiêu dùng có thể ảnh hưởng đến hoạt động của Redis.

Mặt khác, Kafka là một bản ghi phân tán, thông lượng cao, có thể được sử dụng như một hàng đợi. Tại đây bất kỳ số lượng người dùng nào cũng có thể sản xuất và người tiêu dùng có thể tiêu thụ bất cứ lúc nào họ muốn. Nó cũng cung cấp sự bền bỉ cho các tin nhắn được gửi qua hàng đợi.

Final Take:

Sử dụng Redis:

  1. Nếu bạn muốn có một hệ thống chữa cháy và quên đi, nơi mà tất cả các thông điệp mà bạn tạo ra sẽ được truyền tải ngay lập tức đến người tiêu dùng.
  2. Nếu tốc độ được quan tâm nhất.
  3. Nếu bạn có thể sống chung với mất dữ liệu.
  4. Nếu bạn không muốn hệ thống giữ tin nhắn đã được gửi đi.
  5. Số lượng dữ liệu sẽ được xử lý không lớn.

Sử dụng kafka:

  1. Nếu bạn muốn độ tin cậy.
  2. Nếu bạn muốn hệ thống của mình có một bản sao của các tin nhắn đã được gửi ngay cả sau khi sử dụng.
  3. Nếu bạn không thể sống với mất dữ liệu.
  4. Nếu Tốc độ không phải là một mối quan tâm lớn.
  5. kích thước dữ liệu rất lớn

69
Một điểm khác biệt chính là Redis Pub / Sub dựa trên push trong khi Kafka Pub / Sub dựa trên pull. Điều đó có nghĩa là các tin nhắn được xuất bản đến Redis sẽ được tự động gửi đến người đăng ký ngay lập tức, trong khi trong Kafka Dữ liệu / tin nhắn không bao giờ được đẩy ra ngoài cho người tiêu dùng, người tiêu dùng sẽ yêu cầu tin nhắn khi người dùng đã sẵn sàng xử lý tin nhắn. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni

Đọc phần này: redis.io/topics/persistence Tôi có thể giữ các tin nhắn đã được gửi đi. Tôi có lầm không?
David D.

1
@DavidD: Liên kết bạn cung cấp cho biết cách bạn có thể định cấu hình redisđể đảm bảo rằng các thư đã được gửi nhưng chưa được xử lý sẽ không bị mất sau khi khởi động lại redis. Mặc dù có thể làm điều đó, redisnhưng không cho phép giữ (hoặc giữ để sử dụng lại các từ của @Karthikeyan) ra khỏi hộp.
Younes

11

Phiên bản Redis 5.0+ cung cấp cấu trúc dữ liệu Stream . Nó có thể được coi là cấu trúc dữ liệu nhật ký với đảm bảo giao hàng. Nó cung cấp một loạt các hoạt động chặn cho phép người tiêu dùng đợi dữ liệu mới được nhà sản xuất thêm vào luồng và thêm vào đó là một khái niệm được gọi là Nhóm người tiêu dùng.

Về cơ bản cấu trúc Stream cung cấp capabilites giống như Kafka.

Đây là tài liệu https://redis.io/topics/streams-intro

Có hai ứng dụng khách Java phổ biến nhất hỗ trợ tính năng này: Redisson và Jedis


1
Nikita mình :) Thư viện thanh lịch! Chỉ mới bắt đầu sử dụng nó. Cấu trúc tốt và suy nghĩ ra! Bạn là một thiên tài thưa ngài!
mmm

@mmm Cảm ơn bạn!
Nikita Koksharov

Tôi đang có một số câu hỏi liên quan đến việc sử dụng hợp lý và không, và tôi sợ đặt ra các giả định sai? Có lẽ bạn có thể xem lại hai câu hỏi tôi đã thêm ở đây trên SO. Cũng rất muốn thêm bạn trên Skype để làm phiền bạn đôi khi nếu điều đó là ổn. Tôi có thể cung cấp một số thông tin chi tiết về cách tôi muốn sử dụng nó. Không phải là một noob hoàn toàn :)
mmm

Ví dụ: tôi hiện đang tạo một bản đồ có thể truy cập ... sử dụng id thời gian chạy làm khóa, sau đó thêm danh sách những thứ mà hệ thống hiện đang xử lý từ một danh sách ... danh sách, tôi có thể tạo ArrayList cho tôi , tôi tin rằng redisson sẽ chuyển đổi nó nội bộ cho tôi, nhưng nếu tôi không chuyển đổi nó và tạo một danh sách redisslon, thì tôi phải đặt tên cho nó, đúng không? Sau đó, bạn sẽ đặt tên cho danh sách đó trong nội bộ là gì? Một id ngẫu nhiên? Sau đó, API của bạn có nên không cung cấp một tham số ít hơn createList, createMap và v.v. vì có một usecase cho nó?
mmm

Chắc chắn tôi có thể gửi một randomUuid nhưng sẽ rất vui khi biết redisson có một trình tạo tên tốt. Tôi cũng đang viết Deque của riêng mình để xử lý các công việc hàng loạt có chứa deque redisson, được sao lưu bởi một bản đồ có chứa các phần tử "đã". Nếu chúng ta có 10 hệ thống với mỗi 8 luồng xử lý hàng đợi, và một quả bom hạt nhân xảy ra, tất cả những hệ thống đó sẽ bị mất và không được xử lý, vì chúng đã được thực hiện nhưng chưa được xử lý hoàn chỉnh.
mmm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.