有很多关于kafka和事件源的文章。大多数文章都是关于kafka在进行事件源时并不真正有用,因为您不能仅为给定的聚合id查询事件。如果您将事件存储在一个主题中,那么是的,这是真的。这是因为我们需要阅读所有事件,跳过那些不相关的事件。但是将事件存储在rocksdb中呢?现在,我们可以通过使用聚合id作为前缀来查询给定聚合的所有事件,并在rocksdb中进行范围查询。
这是一个好方法吗?我知道这将使用大状态,当重新平衡发生时可能会出现问题。但同样,也许卡夫卡的静态会员资格会对此有所帮助。
Kafka Streams默认的基于磁盘的StateStore是RocksDB,所以是的,这是一种非常有效的方法。
不过,您可以通过Kafka Streams API查询商店,而不是直接查询RocksDB。
现在,我们可以通过使用聚合id作为前缀来查询给定聚合的所有事件
不清楚前缀的含义。存储区完全由Kafka记录密钥构建,而不是由前缀值构建。然而,正如评论中所链接的,商店确实支持前缀扫描,但我认为这将是kafka记录密钥的前缀
这将使用大状态,并且可能是有问题的
您可以参阅"内存管理"页面,了解处理状态以及为处理其大小而调整的内容。
Kafka Streams和RockDB对于快速启动理解概念来说确实是一个很好的解决方案,但我不确定从长远来看,这对生产来说是个好主意。
我个人使用RockDB的经验在生产中并没有那么出色,如果你计划在生产中使用Key/Value数据库,Apache Cassandra似乎是一个更好的解决方案。
但您也是对的,仅通过主键查询内容并没有那么灵活,因此实现CQRS确实更有意义,因此您可以为Query Side获得更大的灵活性。
作为一个走了你计划走的路的人,你可以在我的博客中找到我提出的解决方案:(