使用SpringBoot进行Kafka配置的问题

时间:2018-07-18 16:42:23

标签: java spring-boot apache-kafka spring-kafka

我们的团队一直在尝试使用Kafka解决问题。自从我们开始开发应用程序以来,就一直存在这个问题。

开始时,这些问题很快得到解决。 “失败了吗?只需重新启动服务器”。由于我们想开始向公众发布我们的应用程序,因此这种“解决方案”不再可行。

我们面临的问题基本上是两个:

消费者停止工作

这是经常性的。突然有些消费者停下来了。消息已成功发送到Kafka,我们甚至可以使用Kafka工具查看实际消息,但使用者无法使用。

循环消息

相反。有时会发送一条消息,而使用者只是继续使用该消息,直到我们重新启动服务器为止。

我们尝试将Kafka直接配置到服务器中,但是我们意识到由于某些原因,Kafka忽略了这些配置,而是直接从Spring Boot中获取配置。

我们的配置如下:

消费者:

    properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_BOOTSTRAP);
    properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    properties.put(ConsumerConfig.GROUP_ID_CONFIG, KAFKA_CONSUMER_GROUP);
    properties.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, 5000000);
    properties.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, 10800000);

制作人:

    properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.KAFKA_HOST);
    properties.put(ProducerConfig.RETRIES_CONFIG, 0);
    properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
    properties.put(ProducerConfig.LINGER_MS_CONFIG, 1);
    properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
    properties.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 5000000);
    properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "gzip");
    properties.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 10800000);

您可以看到极端的超时和大小值,这是因为我们认为问题与消息的大小或服务器的超时有关。我们甚至重新设计了所有应用程序流量,以便我们可以发送较小的消息,那时我们才意识到这不是根本问题。

任何帮助将不胜感激。

Kafka版本0.10

Spring Boot版本1.5.7 Dalston.SR4

我们正在使用spring-cloud-starter-stream-kafka依赖项。

我们检查了日志,但没有可识别的错误。实际上,只有信息消息,但没有一个消息有用。

1 个答案:

答案 0 :(得分:1)

不幸的是,Boot 1.5引入了不再支持的旧版本的spring-kafka(1.1.x)。 Boot具有有关依赖项版本控制的严格规则。如the Spring for Apache Kafka project page所述:

  

所有具有代理> = 0.10.x.x的用户都建议使用spring-kafka版本1.3.x或更高版本,这归功于KIP-62,它的线程模型更简单。

当前的1.3.x版本是1.3.5。尝试升级到该版本和0.11 kafka-clients jar。

对于1.1.x,存在复杂的逻辑,需要缓慢的侦听器来暂停/恢复使用者,以避免代理重新平衡。虽然我自己还没看过,但有报道说,消费者在暂停后无法正确恢复。

由于KIP-62,不再需要此逻辑,因为心跳是在后台发送的。但是,您需要确保max.poll.interval.ms足够大以支持处理max.poll.records

如果可以的话,如果升级到引导2.0.4并引入最新的spring-kafka 2.1.7会更好。