Apache kafka 我们可以在多个Kafka Streams任务之间共享应用程序级缓存吗

Apache kafka 我们可以在多个Kafka Streams任务之间共享应用程序级缓存吗,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,假设我在Kafka Streams应用程序中有一个内存缓存。输入主题有2个分区,因此为了实现最大并行性,我配置了1个streams应用程序实例和2个线程 在我的流处理器中,我进行远程调用以获取一些数据,并将其放在映射中进行缓存 由于Kafka streams将为每个任务分配一个线程,并且两个任务都将尝试并行更新缓存的映射,因此我是否必须确保缓存的映射线程安全?在可能运行多个Kafka streams任务的应用程序实例中共享应用程序级缓存是否不可取?我相信您正在寻找的是一个GlobalKTable

假设我在Kafka Streams应用程序中有一个内存缓存。输入主题有2个分区,因此为了实现最大并行性,我配置了1个streams应用程序实例和2个线程

在我的流处理器中,我进行远程调用以获取一些数据,并将其放在映射中进行缓存


由于Kafka streams将为每个任务分配一个线程,并且两个任务都将尝试并行更新缓存的映射,因此我是否必须确保缓存的映射线程安全?在可能运行多个Kafka streams任务的应用程序实例中共享应用程序级缓存是否不可取?

我相信您正在寻找的是一个GlobalKTable,它存储来自所有分区的数据。在我看来,您需要进行远程调用,将结果推送到主题中,然后使用该主题在同一应用程序中创建GlobalKTable。GlobalKTable由RocksDB实例支持,该实例将数据存储在“本地”文件系统中,可以使用键进行查询,就像查询地图一样


警告:GlobalKTable源主题可能会变得非常庞大,如果您不使用持久文件系统,可能会影响您的启动时间,因为在应用程序实际启动之前,GlobalKTable需要使用“源”主题(由GlobalStreamThread完成)上的所有数据进行水合处理。因此,您可能需要在“源”主题上配置压缩。

我相信您正在寻找的是一个GlobalKTable,它存储来自所有分区的数据。在我看来,您需要进行远程调用,将结果推送到主题中,然后使用该主题在同一应用程序中创建GlobalKTable。GlobalKTable由RocksDB实例支持,该实例将数据存储在“本地”文件系统中,可以使用键进行查询,就像查询地图一样


警告:GlobalKTable源主题可能会变得非常庞大,如果您不使用持久文件系统,可能会影响您的启动时间,因为在应用程序实际启动之前,GlobalKTable需要使用“源”主题(由GlobalStreamThread完成)上的所有数据进行水合处理。因此,您可能需要在“源”主题上配置压缩。

两个线程是否都需要访问缓存中的相同数据?或者,每个线程是否需要缓存它感兴趣的数据?两者都需要访问相同的数据。如果有多个线程,则需要使缓存线程安全。-一般来说,缓存可能会成为瓶颈,但我想只要线程数量较少,就可以了。两个线程是否都需要访问缓存中的相同数据?或者,每个线程是否需要缓存它感兴趣的数据?两者都需要访问相同的数据。如果有多个线程,则需要使缓存线程安全。-一般来说,缓存可能会成为瓶颈,但我想,只要线程数量较少,就可以了。我认为这是一个有效的建议,我已经研究过了。但是,缓存的数据不属于我的服务,而且还有一个Kafka主题/全局表,这似乎是一种过分的做法。我只是想了解访问应用程序级缓存是否会有问题。我认为这是一个有效的建议,我已经研究过了。但是,缓存的数据不属于我的服务,而且还有一个Kafka主题/全局表,这似乎是一种过分的做法。我只是想了解访问应用程序级缓存是否会有问题。