Diferença entre Redis e Kafka [fechado]

91

O Redis pode ser usado como pub-sub em tempo real, assim como o Kafka.

Estou confuso sobre qual usar quando.

Qualquer caso de uso seria de grande ajuda.

Sweta Sharma
fonte
15
Não sei por que essa pergunta foi encerrada como "baseada em opinião"? Existem diferenças técnicas objetivas entre os dois e a resposta existente descreve claramente essas diferenças.
David Anderson

Respostas:

143

O pub-sub do Redis é mais como um sistema de fogo e esquecimento, em que todas as mensagens que você produziu serão entregues a todos os consumidores de uma vez e os dados não serão mantidos em lugar nenhum. Você tem limitação de memória em relação ao Redis. Além disso, o número de produtores e consumidores pode afetar o desempenho no Redis.

Kafka, por outro lado, é um log distribuído de alto rendimento que pode ser usado como uma fila. Aqui, qualquer número de usuários pode produzir e os consumidores podem consumir quando quiserem. Ele também fornece persistência para as mensagens enviadas pela fila.

Tomada final:

Use Redis:

  1. Se você quer acender e esquecer tipo de sistema, onde todas as mensagens que você produz são entregues instantaneamente aos consumidores.
  2. Se a velocidade está mais preocupada.
  3. Se você pode viver com a perda de dados.
  4. Se você não quiser que seu sistema retenha a mensagem que foi enviada.
  5. A quantidade de dados que será tratada não é enorme.

Use kafka:

  1. Se você deseja confiabilidade.
  2. Se você deseja que seu sistema tenha uma cópia das mensagens enviadas mesmo após o consumo.
  3. Se você não consegue viver com a perda de dados.
  4. Se a velocidade não é uma grande preocupação.
  5. o tamanho dos dados é enorme
Karthikeyan Gopall
fonte
74
Uma diferença principal é que o Redis Pub / Sub é baseado em push, enquanto o Kafka Pub / Sub é baseado em pull. Isso significa que as mensagens publicadas no Redis serão entregues automaticamente aos assinantes instantaneamente, enquanto no Kafka Data / as mensagens nunca são enviadas aos consumidores, o consumidor pedirá mensagens quando estiver pronto para lidar com a mensagem. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni
Lendo isto: redis.io/topics/persistence me parece possível reter as mensagens que foram enviadas. Estou errado?
David D.
1
@DavidD: O link que você forneceu explica como você pode configurar redispara garantir que as mensagens que foram enviadas, mas ainda não processadas , não sejam perdidas após a reinicialização do redis. Embora seja possível fazer isso, redisnão permite manter (ou continuar a reutilizar palavras de @Karthikeyan) fora da caixa.
Younes
12

A versão Redis 5.0+ fornece a estrutura de dados Stream . Pode ser considerada uma estrutura de dados de log com garantia de entrega. Ele oferece um conjunto de operações de bloqueio que permite aos consumidores esperar por novos dados adicionados a um fluxo pelos produtores e, além disso, um conceito chamado Grupos de Consumidores.

Basicamente, a estrutura Stream fornece as mesmas capacidades do Kafka.

Aqui está a documentação https://redis.io/topics/streams-intro

Existem dois clientes Java mais populares que suportam esse recurso: Redisson e Jedis

Nikita Koksharov
fonte
1
O próprio Nikita :) Biblioteca elegante! Apenas comecei a usar. Bem estruturado e pensado! Você é um gênio, senhor!
mmm
@mmm Obrigado!
Nikita Koksharov
Estou tendo algumas dúvidas sobre o uso adequado ou não, e tenho medo de fazer suposições erradas. Talvez você possa revisar as duas perguntas que adicionei aqui no SO. Também adoraria adicioná-lo ao Skype para incomodá-lo às vezes, se estiver tudo bem. Posso fornecer algumas dicas sobre como desejo usá-lo. Não é um noob total :)
mmm
Por exemplo, atualmente estou criando um mapa armazenável em cache ... usando um ID de tempo de execução como chave e, em seguida, adicionando uma lista de coisas que o sistema está processando de um deque ... a lista, posso criar um ArrayList para eu acho , acredito que o redisson irá convertê-lo internamente para mim, mas se eu não converter e criar uma lista de redisslon, então terei que dar um nome, correto? Que nome você daria a essa lista internamente, então? Uma identificação aleatória? Sua API não deve fornecer um parâmetro menos createList, createMap e etc, uma vez que existe um caso de uso para ele?
mmm
Claro que posso enviar um randomUuid, mas seria bom saber que o redisson tem um bom gerador de nomes. Também estou escrevendo meu próprio Deque para processar jobs em lote contendo um deque de redisson, apoiado por um mapa contendo elementos "retirados". Se tivermos 10 sistemas com cada 8 threads processando a fila e ocorrer uma bomba nuclear, todos eles serão perdidos e deixados sem processamento, uma vez que foram levados, mas não processados ​​completamente.
mmm