Kafka Streams:商店尚未就绪

时间:2018-06-05 13:05:30

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

我们最近将Kafka升级到v1.1,将Confluent升级到v4.0。但升级后我们遇到了有关州商店的持续问题。我们的应用程序启动一组流,我们检查状态存储是否准备就绪,然后在100次尝试后终止应用程序。但升级后,至少有一个流将Store is not ready : the state store, <your stream>, may have migrated to another instance 流本身具有RUNNING状态,消息将流过,但商店的状态仍然显示为未准备好。所以我不知道可能会发生什么。

  • 我应该查看商店状态吗?
  • 由于我们的应用程序有很多流(~15),所以会启动 它们会同时引发问题吗?
  • 我们不应该重启 - 目前我们将其作为服务运行 在linux上

我们在3个经纪人的集群中运行Kafka.Below是一个示例流(不是整个代码):

public BaseStream createStreamInstance() {
    final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
    final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
    final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);

    MessagePayLoadParser<Note> noteParser = new MessagePayLoadParser<Note>(Note.class);
    GenericJsonSerde<Note> noteSerde = new GenericJsonSerde<Note>(Note.class);

    StreamsBuilder builder = new StreamsBuilder();

    //below reducer will use sets to combine
    //value1 in the reducer is what is already present in the store.
    //value2 is the incoming message and for notes should have max 1 item in it's list (since its 1 attachment 1 tag per row, but multiple rows per note)
    Reducer<Note> reducer = new Reducer<Note>() {
        @Override
        public Note apply(Note value1, Note value2) {
            value1.merge(value2);
            return value1;
        }
    };

    KTable<Long, Note> noteTable = builder
            .stream(this.subTopic, Consumed.with(jsonSerde, jsonSerde))
            .map(noteParser::parse)
            .groupByKey(Serialized.with(Serdes.Long(), noteSerde))
            .reduce(reducer);

    noteTable.toStream().to(this.pubTopic, Produced.with(Serdes.Long(), noteSerde));

    this.stream = new KafkaStreams(builder.build(), this.properties);
    return this;
}

1 个答案:

答案 0 :(得分:0)

这里有一些未解决的问题,例如马蒂亚斯(Matthias)发表的问题,但会尝试回答/为您的实际问题提供帮助:

  • 我不应该检查商店状态吗? 此处通常是重新平衡。但是在那种情况下,您不应看到分区的线程不断消耗,而应将处理“转移”到另一个接管的线程上。确保实际上是继续处理该分区的线程是那个线程,而不是新线程。检查kafka-consumer-groups实用程序以关注那里的使用者(线程)。
  • 并且由于我们的应用程序有很多流(〜15个),因此同时启动它们会导致问题吗?不,重新平衡是自动的。
  • 我们是否应该执行硬重启-当前我们将其作为服务在linux上运行,您是否将状态存储保存在某个非默认目录中?您应该正确配置状态存储目录,并确保该目录可访问,并且对应用程序重启不敏感。不确定如何执行硬重启,但是应该涵盖一些异常处理代码,从而关闭流应用程序。