事件存储(如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 天。您也可以在主题级别更改它。
在这种情况下,如果需要,消费者将无法读取整个历史记录,因此在这种情况下,消费者通常会:
- 在偏移量 5
处消费消息,即“将 5 号弹珠添加到红色罐子中”
- 执行增量步骤,即
redCount++
并将最新信息 (redCount = 5
) 存储在本地状态存储中
- 然后将偏移量提交回 Kafka,告知它已读取偏移量 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
试图理解事件驱动的微服务;就像在 this 视频中一样。似乎基本思想是“生产者创建改变系统状态的任务。消费者阅读所有相关任务(来自他们关心的任何主题)并据此做出决定”
所以,如果我有一个罐子系统——比如一个红色、蓝色和绿色的罐子(主题)。然后让生产商在每个罐子里添加弹珠(比方说,根据随机数决定颜色)。生产者会告诉卡夫卡“在红色中添加一个大理石。在蓝色中添加一个大理石……等等” 然后,消费者,每次我们想要计算 jars 时都会得到整个日志并说“好的,一个弹珠被添加到红色,所以 redCount++,然后一个弹珠被添加到蓝色,所以 blueCount++...”对于 dozens/hundreds/thousands 日志文件占用的行数?
这不可能是正确的;我知道这不可能是正确的。这似乎非常低效;差点反效率!
我对 kafka 任务的了解还缺少什么?
每个主题中的数据将按照 属性 log.retention.{hours|minutes|ms}
保留。在 Kafka 服务器级别,所有主题默认设置为 7 天。您也可以在主题级别更改它。
在这种情况下,如果需要,消费者将无法读取整个历史记录,因此在这种情况下,消费者通常会:
- 在偏移量 5 处消费消息,即“将 5 号弹珠添加到红色罐子中”
- 执行增量步骤,即
redCount++
并将最新信息 (redCount = 5
) 存储在本地状态存储中 - 然后将偏移量提交回 Kafka,告知它已读取偏移量 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