Java 卡夫卡将数据流和写入状态存储

Java 卡夫卡将数据流和写入状态存储,java,apache-kafka-streams,spring-cloud-stream-binder-kafka,Java,Apache Kafka Streams,Spring Cloud Stream Binder Kafka,我正在开发一个用SpringCloudStream构建的Kafka Streams应用程序。在此应用程序中,我需要: 使用可在以后检索的连续消息流 持久化符合某些条件的消息ID列表 在一个单独的线程中,运行一个调度器,该调度器以固定的间隔读取消息ID,检索与这些ID匹配的相应消息,并对这些消息执行操作 从列表中删除已处理的邮件ID,以便不会重复工作 我已考虑按以下方式实施: 将传入的消息流作为物化的KTable使用,以便我以后可以按键查找和检索消息 在另一个状态存储中具体化消息ID列表 使用Sp

我正在开发一个用SpringCloudStream构建的Kafka Streams应用程序。在此应用程序中,我需要:

  • 使用可在以后检索的连续消息流
  • 持久化符合某些条件的消息ID列表
  • 在一个单独的线程中,运行一个调度器,该调度器以固定的间隔读取消息ID,检索与这些ID匹配的相应消息,并对这些消息执行操作
  • 从列表中删除已处理的邮件ID,以便不会重复工作
  • 我已考虑按以下方式实施:

  • 将传入的消息流作为物化的KTable使用,以便我以后可以按键查找和检索消息
  • 在另一个状态存储中具体化消息ID列表
  • 使用Spring的调度机制运行一个单独的线程,该线程通过
    InteractiveQueryService
    bean从状态存储读取数据
  • 我遇到的问题是,
    InteractiveQueryService
    提供对状态存储的只读访问,因此我无法删除其他线程中的条目。我决定不使用卡夫卡流的标点功能,因为语义不同;无论对入站消息进行何种处理,我的调度线程必须始终以固定的间隔运行

    另一种选择可能是使用低级处理器API,并将对可写状态存储的引用传递给我的调度程序线程。我需要同步写操作。但我不确定这是否是可以做到的,或者在从单独的线程访问状态存储时是否存在其他限制

    任何意见或建议将不胜感激

    无论对入站消息进行何种处理,我的调度线程必须始终以固定的间隔运行

    好吧,基于
    挂钟时间的标点符号正是你上面描述的

    我遇到的问题是InteractiveQueryService提供对状态存储的只读访问

    使用处理器API和标点符号,您可以使用
    ProcessorContext>getStateStore()
    访问
    init()
    中的状态存储,并从
    ProcessorContext\schedule()中的存储中删除条目。此解决方案的优点是,处理器和标点器在同一个线程中运行,并且它们之间不需要任何同步