事件存储(如kafka)下不存在数据库吗?我们不再从数据库中查询数据了吗?

do databases not exist under event stores (like kafka)? Do we not query data from databases anymore?

试图理解事件驱动的微服务;就像在 this 视频中一样。似乎基本思想是“生产者创建改变系统状态的任务。消费者阅读所有相关任务(来自他们关心的任何主题)并据此做出决定”

所以,如果我有一个罐子系统——比如一个红色、蓝色和绿色的罐子(主题)。然后让生产商在每个罐子里添加弹珠(比方说,根据随机数决定颜色)。生产者会告诉卡夫卡“在红色中添加一个大理石。在蓝色中添加一个大理石……等等” 然后,消费者,每次我们想要计算 jars 时都会得到整个日志并说“好的,一个弹珠被添加到红色,所以 redCount++,然后一个弹珠被添加到蓝色,所以 blueCount++...”对于 dozens/hundreds/thousands 日志文件占用的行数?

这不可能是正确的;我知道这不可能是正确的。这似乎非常低效;差点反效率!

我对 kafka 任务的了解还缺少什么?

每个主题中的数据将按照 属性 log.retention.{hours|minutes|ms} 保留。在 Kafka 服务器级别,所有主题默认设置为 7 天。您也可以在主题级别更改它。

在这种情况下,如果需要,消费者将无法读取整个历史记录,因此在这种情况下,消费者通常会:

  1. 在偏移量 5
  2. 处消费消息,即“将 5 号弹珠添加到红色罐子中”
  3. 执行增量步骤,即 redCount++ 并将最新信息 (redCount = 5) 存储在本地状态存储中
  4. 然后将偏移量提交回 Kafka,告知它已读取偏移量 5 处的消息
  5. 那么,就等下一条消息吧...

但是,如果您的消费者没有本地状态存储 - 在这种情况下,您需要增加保留期,即 log.retention.ms=-1 以永久存储数据。您可以配置消费者以将该信息本地存储在内存中,但如果发生故障,消费者别无选择,只能从头开始读取。我同意这是低效的。

Kafka Streams确实使用了可查询的数据库,特别是RocksDB,虽然接口是可插拔的,但不建议与外部网络数据库一起使用

在您的示例中,如果您向某个主题发出事件

(red, 1)
(blue, 1)
(green, 2)
(green, -1)

您可以通过使用所有这些事件来构建 有状态 总计表示形式 table

(red, 1)
(blue, 1)
(green, 1)

如果你在每个个体 add/remove 之后建立一个 紧凑的主题 总数,那么你可以随时保持每种颜色的最终状态,与每个新的颜色键都会覆盖先前已知的状态。如果您想从状态中完全删除一种颜色,您将为该颜色发送一个空值

您还可以使用窗口扩展此示例,以计算随时间推移添加每种颜色的速率,或最近最流行的颜色(想想,热门话题)

你可以看到一些非常有趣的东西applications/calculationsin this KSQL blog