事务生产者与幂等生产者java(异常outofordersequenceexception)

8yparm6h  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(654)

我使用带有幂等生产者配置的spring kafka:
以下是我的配置道具:

Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Joiner.on(",").join(appProps.getBrokers()));
//configure the following three settings for SSL Encryption
    props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
    props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, appProps.getJksLocation());
    props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG,  appProps.getJksPassword());
    props.put(ProducerConfig.ACKS_CONFIG, "all");
    props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true);
    props.put(ProducerConfig.RETRIES_CONFIG, 5);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

我的Kafka制作人抛出了顺序例外:
2019-03-06 21:25:47 sender[error][producer clientid=producer-1]代理返回org.apache.kafka.common.errors.outofordersequenceexception:代理在偏移量-1处收到主题分区topic-1的无序序列号。这表示代理上的数据丢失,应进行调查。2019-03-06 21:25:47 transactionmanager[info][producer clientid=producer-1]producerid设置为-1,epoch为-1 2019-03-06 21:25:47 producerkafka[error]发送到kafka时遇到错误,请重试作业
我不知道为什么会抛出此异常。我找不到具体的答案。例外情况的官方javadoc声明如下:
此异常表示代理接收到来自生产者的意外序列号,这意味着数据可能已丢失。如果producer仅配置为幂等(即,如果设置了enable.idemptence,但未配置transactional.id),则可以使用同一producer示例继续发送,但这样做可能会导致已发送记录的重新排序。对于事务生产者,这是一个致命错误,您应该关闭生产者。
这是否意味着我需要使用事务生产者来避免这个问题?
kafkaproducer doc陈述了一些使上述陈述模棱两可的东西:https://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/producer/kafkaproducer.html
要启用幂等性,必须将enable.idempotence配置设置为true。如果设置,retries config将默认为integer.max\u value,max.in.flight.requests.per.connection config将默认为1,acks config将默认为all。幂等生产者没有api更改,因此不需要修改现有的应用程序来利用此功能。
为了利用幂等生产者,必须避免应用程序级的重发,因为这些重发不能消除重复。因此,如果应用程序启用了幂等性,则建议将retries config保留为未设置,因为它将默认为integer.max\u值。此外,如果send(producerrecord)返回错误,即使重试次数无限(例如,如果消息在发送前在缓冲区中过期),则建议关闭生产者并检查最后生成的消息的内容,以确保其不重复。最后,生产者只能保证在单个会话中发送的消息的幂等性。
上面的语句清楚地指出,对于幂等生产者,我所需要的只是使用 enable.idempotence 财产。但是,异常声明我必须使用它 transactional.id 财产。
创建幂等异步生产者而不必处理致命错误的正确方法是什么 OutOfOrderSequenceException .

tkqqtvp1

tkqqtvp11#

我觉得很清楚;从你的第二句话。。。
为了利用幂等生产者,必须避免应用程序级的重发,因为这些重发不能消除重复。因此,如果应用程序启用了幂等性,则建议将retries config保留为未设置,因为它将默认为integer.max\u值。
你也有

props.put(ProducerConfig.RETRIES_CONFIG, 5);

相关问题