Java 卡夫卡偏移量未增加

Java 卡夫卡偏移量未增加,java,apache-kafka,kafka-producer-api,spring-kafka,Java,Apache Kafka,Kafka Producer Api,Spring Kafka,我将卡夫卡与弹簧靴配合使用: spring.kafka.producer.retries=0 spring.kafka.producer.batch-size=100000 spring.kafka.producer.request.timeout.ms=30000 spring.kafka.producer.linger.ms=10 spring.kafka.producer.acks=0 spring.kafka.producer.buffer-memory=33554432 spring.

我将卡夫卡与弹簧靴配合使用:

spring.kafka.producer.retries=0
spring.kafka.producer.batch-size=100000
spring.kafka.producer.request.timeout.ms=30000
spring.kafka.producer.linger.ms=10
spring.kafka.producer.acks=0
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.max.block.ms=5000
spring.kafka.bootstrap-servers=192.168.1.161:9092,192.168.1.162:9093
卡夫卡制作人阶层

@Service
public class MyKafkaProducer {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private static Logger LOGGER = LoggerFactory.getLogger(NotificationDispatcherSender.class);

    // Send Message
    public void sendMessage(String topicName, String message) throws Exception {
        LOGGER.debug("========topic Name===== " + topicName + "=========message=======" + message);
        ListenableFuture<SendResult<String, String>> result = kafkaTemplate.send(topicName, message);
        result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
            @Override
            public void onSuccess(SendResult<String, String> result) {
                LOGGER.debug("sent message='{}' with offset={}", message, result.getRecordMetadata().offset());
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error(Constants.PRODUCER_MESSAGE_EXCEPTION.getValue() + " : " + ex.getMessage());
            }
        });
    }
}
问题

@Service
public class MyKafkaProducer {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private static Logger LOGGER = LoggerFactory.getLogger(NotificationDispatcherSender.class);

    // Send Message
    public void sendMessage(String topicName, String message) throws Exception {
        LOGGER.debug("========topic Name===== " + topicName + "=========message=======" + message);
        ListenableFuture<SendResult<String, String>> result = kafkaTemplate.send(topicName, message);
        result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
            @Override
            public void onSuccess(SendResult<String, String> result) {
                LOGGER.debug("sent message='{}' with offset={}", message, result.getRecordMetadata().offset());
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error(Constants.PRODUCER_MESSAGE_EXCEPTION.getValue() + " : " + ex.getMessage());
            }
        });
    }
}
我有一个主题的5个分区,比如说
mytopic

发生的情况是,我获得了成功(即消息成功发送到Kafka)日志,但topic
my topic
的none分区的偏移量增加了

正如您在上面看到的,我添加了日志
onSuccess
onFailure
。 我所期望的是,当卡夫卡无法向卡夫卡发送消息时,我应该会收到一个错误,但在这种情况下,我不会收到任何错误消息

卡夫卡的上述行为发生的比率为
100:5
(即每100条成功消息发送给卡夫卡后)

Edit1:为成功案例添加卡夫卡制作人日志(即在消费者端成功接收消息)


你的代码对我来说很好

@SpringBootApplication
public class So46892185Application {

    public static void main(String[] args) {
        SpringApplication.run(So46892185Application.class, args);
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(So46892185Application.class);

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            for (int i = 0; i < 10; i++) {
                send(template, "foo" + i);
            }
        };
    }

    public void send(KafkaTemplate<String, String> template, String message) {
        ListenableFuture<SendResult<String, String>> result = template.send(topic().name(), message);
        result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

            @Override
            public void onSuccess(SendResult<String, String> result) {
                LOGGER.info("sent message='{}'"
                        + " to partition={}"
                        + " with offset={}", message, result.getRecordMetadata().partition(),
                        result.getRecordMetadata().offset());
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error("Ex : " + ex.getMessage());
            }

        });
    }

    @Bean
    public NewTopic topic() {
        return new NewTopic("so46892185-3", 5, (short) 1);
    }

}

你的代码对我来说很好

@SpringBootApplication
public class So46892185Application {

    public static void main(String[] args) {
        SpringApplication.run(So46892185Application.class, args);
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(So46892185Application.class);

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            for (int i = 0; i < 10; i++) {
                send(template, "foo" + i);
            }
        };
    }

    public void send(KafkaTemplate<String, String> template, String message) {
        ListenableFuture<SendResult<String, String>> result = template.send(topic().name(), message);
        result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

            @Override
            public void onSuccess(SendResult<String, String> result) {
                LOGGER.info("sent message='{}'"
                        + " to partition={}"
                        + " with offset={}", message, result.getRecordMetadata().partition(),
                        result.getRecordMetadata().offset());
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error("Ex : " + ex.getMessage());
            }

        });
    }

    @Bean
    public NewTopic topic() {
        return new NewTopic("so46892185-3", 5, (short) 1);
    }

}

它不显示错误,因为您已将spring.kafka.producer.acks设置为0。
将其设置为1,您的回调函数应该可以工作。然后可以查看偏移量是否增加。

它不显示错误,因为您已将spring.kafka.producer.acks设置为0。
将其设置为1,您的回调函数应该可以工作。然后可以查看偏移量是否增加。

问题并非每次都会出现。我还能够成功地向卡夫卡发送消息。但假设在2到3小时后,消息从Kafka成功发送,但分区偏移量没有增加,因此需要更精确地描述问题。你还需要提供证据;光靠语言是不够的。由于日志消息中没有包含分区,很难看出你怎么能声称存在问题。我用卡夫卡生成了一条消息,我收到了这些日志成功日志
onSuccess:36]sent message=''我的卡夫卡消息'发送到分区=4,偏移量=-1
,但我没有在消费者身上收到它,当我检查分区4偏移量计数器时,它没有增加。我使用Yahoo kafka manager作为监控工具。我编辑了我的问题并添加了kafka制作人日志(由kafka library打印的日志)。请看一看。另外,我错误地在你的答案中添加了我的编辑,而不是我的问题。我很抱歉,请忽略它。虽然我不想混淆,请原谅我。我也收到错误
发送失败;嵌套异常为org.apache.kafka.common.errors.TimeoutException:在5000毫秒后更新元数据失败。
。但这是一个独立的案例,我已经提出了这个问题。也就是说,即使我没有收到这个错误消息,分区偏移量计数器也不会增加。我添加上述错误只是为了提供更多关于我的问题的见解。问题并非每次都会出现。我还能够成功地向卡夫卡发送消息。但假设在2到3小时后,消息从Kafka成功发送,但分区偏移量没有增加,因此需要更精确地描述问题。你还需要提供证据;光靠语言是不够的。由于日志消息中没有包含分区,很难看出你怎么能声称存在问题。我用卡夫卡生成了一条消息,我收到了这些日志成功日志
onSuccess:36]sent message=''我的卡夫卡消息'发送到分区=4,偏移量=-1
,但我没有在消费者身上收到它,当我检查分区4偏移量计数器时,它没有增加。我使用Yahoo kafka manager作为监控工具。我编辑了我的问题并添加了kafka制作人日志(由kafka library打印的日志)。请看一看。另外,我错误地在你的答案中添加了我的编辑,而不是我的问题。我很抱歉,请忽略它。虽然我不想混淆,请原谅我。我也收到错误
发送失败;嵌套异常为org.apache.kafka.common.errors.TimeoutException:在5000毫秒后更新元数据失败。
。但这是一个独立的案例,我已经提出了这个问题。也就是说,即使我没有收到这个错误消息,分区偏移量计数器也不会增加。我在上面加上这个错误只是为了让大家对我的问题有更多的了解。你的回答真的很有帮助。非常感谢。你的回答真的很有帮助。非常感谢你。