Różnica między Redis i Kafka [zamknięte]

87

Redis może być używany jako subwoofer w czasie rzeczywistym, tak jak Kafka.

Nie wiem, którego użyć kiedy.

Każdy przypadek użycia byłby bardzo pomocny.

Sweta Sharma
źródło
15
Nie wiem, dlaczego to pytanie zostało zamknięte jako „oparte na opiniach”? Istnieją obiektywne techniczne różnice między tymi dwoma, a istniejąca odpowiedź wyraźnie je przedstawia.
David Anderson

Odpowiedzi:

137

Redis pub-sub jest głównie jak system „odpal i zapomnij”, w którym wszystkie utworzone przez Ciebie wiadomości będą dostarczane do wszystkich klientów naraz, a dane nie są nigdzie przechowywane. Masz ograniczenia pamięci w odniesieniu do Redis. Ponadto liczba producentów i konsumentów może wpływać na wydajność w Redis.

Z drugiej strony Kafka to rozproszony dziennik o dużej przepustowości, który może służyć jako kolejka. Tutaj dowolna liczba użytkowników może produkować, a konsumenci mogą konsumować w dowolnym momencie. Zapewnia również trwałość wiadomości wysyłanych przez kolejkę.

Ostatnie ujęcie:

Użyj Redis:

  1. Jeśli chcesz zapalić i zapomnieć o systemie, w którym wszystkie komunikaty, które tworzysz, są natychmiast dostarczane do konsumentów.
  2. Jeśli chodzi o prędkość.
  3. Jeśli możesz żyć z utratą danych.
  4. Jeśli nie chcesz, aby Twój system zatrzymywał wysłaną wiadomość.
  5. Ilość danych, którymi trzeba będzie zarządzać, nie jest ogromna.

Użyj kafka:

  1. Jeśli chcesz niezawodności.
  2. Jeśli chcesz, aby Twój system miał kopię wiadomości, które zostały wysłane nawet po zużyciu.
  3. Jeśli nie możesz żyć z utratą danych.
  4. Jeśli prędkość nie jest dużym problemem.
  5. rozmiar danych jest ogromny
Karthikeyan Gopall
źródło
69
Jedną z głównych różnic jest to, że Redis Pub / Sub jest oparty na wypychaniu, a Kafka Pub / Sub jest oparty na ściąganiu. Oznacza to, że wiadomości publikowane w Redis będą automatycznie dostarczane do subskrybentów natychmiastowo, podczas gdy w Kafka dane / wiadomości nigdy nie są wysyłane do konsumentów, konsument zapyta o wiadomości, gdy konsument jest gotowy do obsługi wiadomości. cloudkarafka.com/blog/... kafka.apache.org/documentation.html#design_pull
Zeni
Czytając to: redis.io/topics/persistence , wydaje mi się, że mogę przechowywać wiadomości, które zostały wysłane. Czy się mylę?
David D.
1
@DavidD: Podany przez Ciebie link wyjaśnia, w jaki sposób możesz skonfigurować, redisaby wiadomości, które zostały wysłane, ale jeszcze nie przetworzone , nie zostaną utracone po ponownym uruchomieniu programu redis. Chociaż jest to możliwe do zrobienia, że redisnie pozwala na luku (lub zachować do ponownego użycia słów @Karthikeyan) po wyjęciu z pudełka.
Younes
11

Wersja Redis 5.0+ zapewnia strukturę danych Stream . Można to uznać za strukturę danych dziennika z gwarancjami dostawy. Oferuje zestaw operacji blokujących, umożliwiających konsumentom oczekiwanie na nowe dane dodane do strumienia przez producentów, a ponadto koncepcję zwaną grupami konsumentów.

Zasadniczo struktura Stream zapewnia te same możliwości co Kafka.

Oto dokumentacja https://redis.io/topics/streams-intro

Istnieją dwa najpopularniejsze klienty Java obsługujące tę funkcję: Redisson i Jedis

Nikita Koksharov
źródło
1
Sam Nikita :) Elegancka biblioteka! Właśnie zacząłem go używać. Dobrze skonstruowany i przemyślany! Pan jest genialny!
mmm
@mmm Dziękuję!
Nikita Koksharov
Mam kilka pytań dotyczących właściwego użytkowania, a nie, i obawiam się zrobienia błędnych założeń? Może mógłbyś przejrzeć dwa pytania, które dodałem tutaj na SO. Chciałbym również dodać Cię do Skype, aby czasami przeszkadzać, jeśli to jest w porządku. Mogę dać wgląd w to, jak chcę go używać. Nie jest to totalny noob :)
mmm
Na przykład, obecnie tworzę buforowaną mapę ... używając identyfikatora runtimes jako klucza, a następnie dodaję listę rzeczy, które system aktualnie przetwarza z deque ... lista, mogę utworzyć ArrayList dla, jak sądzę , wierzę, że redisson dokona konwersji wewnętrznej dla mnie, ale jeśli tego nie zrobię i utworzę listę redisslon, to muszę nadać jej nazwę, prawda? Jaką nazwę nadałbyś wtedy tej liście wewnętrznie? Losowy identyfikator? Czy zatem twoje API nie powinno również zapewniać parametru bez parametru createList, createMap itp., Ponieważ istnieje dla niego przypadek użycia?
mmm
Jasne, że mogę wysłać randomUuid, ale byłoby miło wiedzieć, że redisson ma generator dobrych nazw. Piszę również własne Deque do przetwarzania zadań wsadowych zawierających deque redissona, wspieranych przez mapę zawierającą „pobrane” elementy. Gdybyśmy mieli 10 systemów z każdym 8 wątkami przetwarzającymi kolejkę i pojawiła się bomba atomowa, wszystkie zostałyby utracone i pozostawione nieprzetworzone, ponieważ zostały pobrane, ale nie zostały w pełni przetworzone.
mmm