Kafka流存储未反映KTable中的当前状态

时间:2018-12-07 11:37:13

标签: java apache-kafka apache-kafka-streams

我有一个主题,其中发布有关文件的事件。在此主题上,将创建一个分组以具有一个表,其中包含每个文件的最新事件。有点像“事件源灯”。流程是这样的:

  • 获取新文件
  • 查询其最新状态
  • 超过3个错误->中止
  • 将状态更新为PENDING并重试+1(使用KafkaProducer产生新事件并等待回调)
  • 处理文件
  • 查询最新状态
  • 将状态设置为SUCCESSFUL(使用相同的KafkaProducer产生新事件并等待回调)

一些代码:

产生新事件:

event -> {
        CompletableFuture<RecordMetadata> retFuture = new CompletableFuture<>();
        topicProducer.send(new ProducerRecord<>(applicationTopicName, flowId, event), (recordMetaData, exception) -> {
            if (exception != null) {
                retFuture.completeExceptionally(exception);
            } else {
                retFuture.complete(recordMetaData);
            }
        });

        return retFuture;
    }

以及稍后查询的商店:

        HistoryEventSerde historyEventSerde = new HistoryEventSerde();
    KStream<String, HistoryEvent> eventStream = builder.stream(applicationTopicName, Consumed.with(Serdes.String(),
            historyEventSerde));


    eventStream.selectKey((key, value) -> new HistoryEventKey(key, value.getIdentifier()))
            .groupByKey(Grouped.<HistoryEventKey, HistoryEvent>as(null)
                    .withKeySerde(new HistoryEventKeySerde())
                    .withValueSerde(new HistoryEventSerde())
            )
            .reduce((e1, e2) -> e2,
                    Materialized.<HistoryEventKey, HistoryEvent, KeyValueStore<Bytes, byte[]>>as(streamByKeyStoreName)
                            .withKeySerde(new HistoryEventKeySerde()));

现在为示例文件(我们称其为file1)会发生这种情况:

  • 查询其最新状态-> null
  • 超过3个错误? ->否
  • 产生具有RetryCount 0和PENDING状态的新事件
  • 处理文件
  • 查询其最新状态-> PENDING重试计数0(可以)
  • 将状态设置为“成功”并发布到kafka

第一次没关系。现在,假设相同的文件再次进入该过程:

  • 查询其最新状态->成功,0次重试
  • 超过3个错误? ->否
  • 产生具有重试计数1和PENDING状态的新事件
  • 处理文件
  • 查询其最新状态->成功,0次重试<----问题,这不是最后的状态

这可能是什么问题?我曾假设我的归约操作不好(例如:事件的顺序不同),但是从那时起,我给事件添加了时间戳,并以仅保留最新的方式归约它们,但是发生与上述相同的行为。我在做什么错了?

0 个答案:

没有答案