【问题标题】:Difference between Redis and KafkaRedis 和 Kafka 的区别
【发布时间】:2016-10-25 17:43:26
【问题描述】:

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

我不知道什么时候使用哪个。

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

【问题讨论】:

  • 我不知道为什么这个问题被关闭为“基于意见”?两者之间存在客观的技术差异,现有答案清楚地概述了这些差异。

标签: redis apache-kafka publish-subscribe


【解决方案1】:

Redis pub-sub 基本上就像一个“一劳永逸”的系统,您生成的所有消息都将立即传递给所有消费者,而数据无处保存。您对 Redis 的内存有限制。此外,生产者和消费者的数量也会影响 Redis 的性能。

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

最终结果:

使用 Redis:

  1. 如果您想要一个“一劳永逸”的系统,您生成的所有消息都会立即传递给消费者。
  2. 如果最关心速度。
  3. 如果您能忍受数据丢失。
  4. 如果您不希望系统保留已发送的消息。
  5. 要处理的数据量并不大。

使用卡夫卡:

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

【讨论】:

  • 一个主要区别是 Redis Pub/Sub 是基于推送的,而 Kafka Pub/Sub 是基于拉取的。这意味着发布到 Redis 的消息将立即自动传递给订阅者,而在 Kafka 中,数据/消息永远不会推送给消费者,当消费者准备好处理消息时,消费者会请求消息。 cloudkarafka.com/blog/…kafka.apache.org/documentation.html#design_pull
  • 阅读:redis.io/topics/persistence 我似乎可以保留已发送的消息。我错了吗?
  • @DavidD:您提供的链接说明了如何配置 redis 以确保已发送但尚未处理的消息将redis 重启后不会丢失。尽管可以这样做,redis 不允许开箱即用 hold(或 keep 重复使用 @Karthikeyan 的话)。
【解决方案2】:

Redis 5.0+版本提供Stream数据结构。它可以被视为具有交付保证的日志数据结构。它提供了一组阻塞操作,允许消费者等待生产者添加到流中的新数据,除此之外,还有一个称为消费者组的概念。

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

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

有两个最流行的 Java 客户端支持此功能:Redisson 和 Jedis

如果需要交付的可靠性,Redisson 会提供 ReliableTopic 对象。 https://github.com/redisson/redisson/wiki/6.-distributed-objects/#613-reliable-topic

【讨论】:

  • 尼基塔本人 :) 优雅的图书馆!刚开始使用它。结构合理,深思熟虑!你真是个天才先生!
  • 我有一些关于正确使用和不正确使用的问题,我害怕做出错误的假设?也许您可以查看我在 SO 上添加的两个问题。如果可以的话,有时也很乐意在 Skype 上添加你来打扰你。我可以提供一些关于我希望如何使用它的见解。不是一个完全的菜鸟:)
  • 例如,我目前正在创建一个可缓存映射...使用运行时 id 作为键,然后添加系统当前正在从双端队列处理的内容列表...列表,我想我可以创建一个 ArrayList,我相信 redisson 会在内部为我转换它,但如果我不这样做并创建一个 redisslon 列表,那么我必须给它一个名字,对吗?那么,您会在内部给该列表起什么名字呢?随机身份证?既然有一个用例,那么您的 API 是否也应该不提供参数少的 createList、createMap 等?
  • 当然我可以发送一个 randomUuid 但很高兴知道 redisson 有一个好的名称生成器。我还在编写自己的 Deque 来处理包含 redisson deque 的批处理作业,并由包含“taken”元素的 map 支持。如果我们有 10 个系统,每个系统有 8 个线程处理队列,并且发生核弹,那么这些系统将全部丢失并且未处理,因为它们被占用但未完全处理。
  • 我的方法是将获取的元素放在一个单独的地图中,使用系统/运行时/pod id跟踪它们。然后我必须记录他们在那里待了多长时间,然后再将他们推回队列。这是关于创建防弹队列/双端队列。那有意义吗?我还必须以安全的方式进行 take 和 put 映射,如果 put 不成功,则回滚 take(理想情况下,如果核爆炸或电力中断恰好发生在那一刻,在 take 和 put 之间)
【解决方案3】:

Kafka vs Redis

Kafka 和 Redis 都是开源工具。在 GitHub 上具有 37.4K 个 GitHub 星和 14.4K 分叉的 Redis 似乎比具有 12.7K GitHub 星和 6.81K GitHub 分叉的 Kafka 更受欢迎。

Airbnb、Uber TechnologiesInstagram 是一些使用 Redis 的热门公司,而 KafkaUber Technologies、Spotify 和 Slack 使用。 Redis 获得了更广泛的认可,在 3261 公司堆栈和 1781 开发人员堆栈中被提及;与列在 509 个公司堆栈和 470 个开发人员堆栈中的 Kafka 相比。

【讨论】:

  • OP 没有要求进行人气竞赛。他们想知道哪个适用于哪个用例。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2020-07-25
  • 2023-03-02
  • 2017-11-09
  • 2013-10-25
  • 2013-10-02
  • 1970-01-01
相关资源
最近更新 更多