这更多的是一个架构问题。我正在学习Apache·Kafka的事件驱动架构和流媒体系统。我已经了解了Event Sourcing和CQRS,并有一些关于实现的基本问题。
例如,考虑一个流应用程序,其中我们正在监控系统中注册的司机的车辆事件。这些活动将以KStream的形式进入。在系统中注册的驱动程序将在KTable中,我们需要连接事件和驱动程序以派生一些输出。
假设我们通过微服务在系统中插入一个新的驱动程序,该微服务将Cassandra表中的数据推送到KTable主题,然后通过更改数据捕获。
1.由于Kafka主题有关联的TTL,如何确保司机记录不会被丢弃?
1.我知道Kafka有一个持久化状态存储,可以维护所需的状态,但我可以像Cassandra表一样依赖它吗?有尺码方面的考虑吗?
1.如果整个应用程序,以及所有Kafka Broker和消费者节点被销毁,应用程序是否可以重启,而不会丢失KTable中的驱动程序记录?
1.如果流媒体应用是基于Kubernetes的,我如何维护每个容器的永久磁盘卷,并在容器来来去去的过程中正确地连接它们?
1.使用Spark Streaming或Flink将事件流与Cassandra中的驱动程序表连接起来是否更可取?Spark和Flink还能保持数据的局部性吗,因为他们的流媒体消费者将通过Kafka分区分发,而Cassandra数据将由我不知道什么分发?
编辑:-我意识到Spark和Flink将在各自的节点上从Cassandra提取数据,这取决于它们拥有什么密钥。Kafka Streaming的优势在于,要加入的Stream和KTable将已经是本地数据。
1条答案
按热度按时间xj3cbfub1#
KTables没有TTL,因为它们是从压缩主题构建的(无限保留)。
是的,您需要维护持久化Kafka StateStore的存储目录。由于这些存储将存储在磁盘上,因此在代理/应用程序重新启动时不应从中删除任何记录,直到您主动从应用程序示例主机上清除状态目录。
Spark/Flink不与Kafka Streams商店整合,并有自己的本地化考虑。我相信Flink提供了RocksDB状态,并且两个广播数据都用于远程连接,否则,连接Kafka记录键需要两个主题具有匹配的分区计数-这种方式将分区分配给相同的示例/执行器,类似于Kafka Streams连接。