Redis和Kafka之间的区别


86

Redis可以像Kafka一样用作实时发布订阅。

我很困惑何时使用哪个。

任何用例都会有很大的帮助。


14
我不确定为什么这个问题被封闭为“基于观点的”?两者之间存在客观的技术差异,现有答案清楚地概述了这些差异。
David Anderson

Answers:


135

Redis pub-sub就像是一个即弃即用系统,其中您产生的所有消息将立即传递给所有使用者,而数据却不保存在任何地方。关于Redis,您的内存有限。同样,生产者和消费者的数量也会影响Redis的性能。

另一方面,Kafka是一种高吞吐量的分布式日志,可以用作队列。在这里,任何数量的用户都可以生产,而消费者可以在任何时候消费。它还为通过队列发送的消息提供持久性。

最终决定:

使用Redis:

  1. 如果您想要一种救火忘了的系统,那么您产生的所有消息都会立即传递给消费者。
  2. 如果最关心速度。
  3. 如果您可以忍受数据丢失。
  4. 如果您不希望系统保留已发送的消息。
  5. 要处理的数据量不是很大。

使用kafka:

  1. 如果您想要可靠性。
  2. 如果您希望系统拥有即使使用后仍已发送的消息副本。
  3. 如果您无法忍受数据丢失。
  4. 如果速度不是大问题。
  5. 数据量巨大

68
一个主要区别是Redis Pub / Sub是基于推送的,而Kafka Pub / Sub是基于pull的。这意味着发布到Redis的消息将立即自动传递给订阅者,而在Kafka中,数据/消息永远不会推送给用户,当用户准备好处理消息时,用户会要求消息。cloudkarafka.com/blog/... kafka.apache.org/documentation.html#design_pull
泽尼

阅读以下内容:redis.io/topics/persistence对我来说似乎可以保留已发送的消息。我错了吗?
David D.

1
@DavidD:您提供的链接说明了如何配置redis以确保重新启动以后不会丢失已发送但尚未处理的消息redis。虽然可以做到这一点,redis不允许持有(或保留到@Karthikeyan重用的话)的开箱。
Younes

10

Redis 5.0+版本提供了Stream数据结构。可以将其视为具有交付保证的日志数据结构。它提供了一组阻止操作,使消费者可以等待生产者添加到流中的新数据,此外还提供了一个名为“消费者组”的概念。

基本上,Stream结构提供与Kafka相同的功能。

这是文档https://redis.io/topics/streams-intro

有两个最受欢迎的Java客户端支持此功能:Redisson和Jedis


1
尼基塔本人:)优雅的图书馆!刚开始使用它。结构良好,经过深思熟虑!你是天才先生!
mmm

@mmm谢谢!
Nikita Koksharov

我对是否正确使用存在一些疑问,我害怕做出错误的假设?也许您可以回顾一下我在此处添加的两个问题。也可以在Skype上添加您,以便在某些时候打扰您。我可以提供一些有关如何使用它的见解。不是完全菜鸟:)
嗯,

例如,我当前正在使用运行时ID作为键来创建一个可缓存的映射...,然后从双端队列中添加系统当前正在处理的东西的列表...该列表,我可以为我创建一个ArrayList ,我相信redisson会为我内部对其进行转换,但是如果我不这样做并创建一个redisslon列表,那么我必须给它起一个名字,对吗?那您内部将给该列表什么名字?随机编号?既然存在用例,您的API是否还应该提供一个比createList,createMap等少的参数?
mmm

当然,我可以发送randomUuid,但是很高兴知道redisson具有良好的名称生成器。我还编写了自己的Deque,用于处理包含重装deque的批处理作业,并由包含“ taken”元素的地图支持。如果我们有10个系统,每个系统有8个线程在处理该队列,并且发生核弹,则这些原子弹将全部丢失,并且未经处理,因为它们已被拿走,但未完全处理。
mmm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.