我如何处理Kafka KStream意外状态?

时间:2018-03-12 22:58:03

标签: apache-kafka apache-kafka-streams

我有一个Kafka流,设置如下:

  1. 有关状态"创建"的主题A的消息进入
  2. 调用远程REST端点以通知已收到消息
  3. 然后转换消息(状态设置为"通知")并发送 回到主题A
  4. 我知道如何为快乐路径设置它(REST端点返回HTTP 2xx)。我的问题是:如果我的端点返回400,我如何配置我的kstream来处理它而不发出消息?

    这是我的KSteam配置:

        final KStream<String, Message> stream = streamsBuilder.stream(topic,
                Consumed.with(Serdes.String(), messageJsonSerde));
        stream
                .filter((key, value) -> MessageType.CASE_MATCHED.equals(
                        value.getEventType()))
                .mapValues(notifierService::handleNotification) // calls REST endpoint
                .to(topic, Produced.with(Serdes.String(), messageJsonSerde));
        return stream;
    

1 个答案:

答案 0 :(得分:1)

我想最简单的方法是在filter之后添加另一个mapValue,删除未成功处理的邮件。

您可以更改第一个mapValue以将此信息添加到记录中,以便filter可以访问它。此外,您可以在第二个mapValue之后再执行一次filter以删除此额外的success标记,以将未修改的消息写回Kafka。

当然,这不会重新处理任何失败的消息,但只会从输出中过滤掉失败的消息。