Java Kafka使用者未使用事务语义(isolation.level=read\u committed)
当Kafka Consumer在属性中具有事务语义时,它无法使用任何消息。但是,当我删除该属性或更新该属性以读取\u uncommitted时,它会消耗消息 以下是我的卡夫卡消费者财产:-Java Kafka使用者未使用事务语义(isolation.level=read\u committed),java,apache-kafka,kafka-consumer-api,kafka-producer-api,Java,Apache Kafka,Kafka Consumer Api,Kafka Producer Api,当Kafka Consumer在属性中具有事务语义时,它无法使用任何消息。但是,当我删除该属性或更新该属性以读取\u uncommitted时,它会消耗消息 以下是我的卡夫卡消费者财产:- Properties props = new Properties(); props.put("bootstrap.servers", "10.2.200.15:9092"); String consumeGroup = "cg3"; props.put("group.id", con
Properties props = new Properties();
props.put("bootstrap.servers", "10.2.200.15:9092");
String consumeGroup = "cg3";
props.put("group.id", consumeGroup);
// Below is a key setting to turn off the auto commit.
props.put("enable.auto.commit", "false");
props.put("heartbeat.interval.ms", "2000");
props.put("session.timeout.ms", "6001");
// Control maximum data on each poll, make sure this value is bigger than the
// maximum // single message size
props.put("max.partition.fetch.bytes", "140");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("isolation.level","read_committed");
Kafka Producer在其属性中有一个事务id,在推送一些消息之后,它作为一个整体提交事务。以下是卡夫卡制作人的财产:-
Properties props = new Properties();
props.put("bootstrap.servers", "10.2.200.15:9092");
String consumeGroup = "cg3";
props.put("group.id", consumeGroup);
// Below is a key setting to turn off the auto commit.
props.put("enable.auto.commit", "false");
props.put("heartbeat.interval.ms", "2000");
props.put("session.timeout.ms", "6001");
// Control maximum data on each poll, make sure this value is bigger than the
// maximum // single message size
props.put("max.partition.fetch.bytes", "140");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("isolation.level","read_committed");
log.info(“初始化属性”);
Properties props=新属性()
下面的代码段负责提交事务:-
public boolean send(ProducerRecordImpl record) {
try {
producer.beginTransaction();
for (int i = 0; i < 10; i++) {
Future<RecordMetadata> futureResult = producer
.send(new ProducerRecord<String, String>(record.getTopic(), record.getPayload()));
/*
* It will wait till the thread execution completes and return true.
*/
//RecordMetadata ack = futureResult.get();
//log.debug("RecordMetadta offset {} and partiton {} ", ack.offset(), ack.partition());
}
producer.commitTransaction();
log.info("Commited");
return true;
public boolean发送(producercordimpl记录){
试一试{
producer.beginTransaction();
对于(int i=0;i<10;i++){
未来结果=生产商
.send(新产品记录(record.getTopic(),record.getPayload());
/*
*它将等待线程执行完成并返回true。
*/
//RecordMetadata ack=futureResult.get();
//debug(“RecordMetadta offset{}和partition{}”,ack.offset(),ack.partition());
}
producer.commitTransaction();
日志信息(“已提交”);
返回true;
我无法从生产者方面理解提交是否没有正确发生,这导致卡夫卡消费者无法使用事务语义阅读它,或者卡夫卡消费者方面存在问题
任何帮助都将不胜感激。您需要先调用producer.initTransactions()。否则,您的producer不会发布事务消息 从 当transactional.id 在配置中设置。此方法执行以下操作:1。 确保由以前的实例启动的任何事务 具有相同transactional.id的生产者已完成。如果 实例失败,事务正在进行中,它将 中止。如果上一个事务已开始完成,但尚未完成 完成后,此方法将等待其完成。2.获取内部 生产者id和历元,用于将来的所有事务消息 由制作人发行
在Kafka上测试事务时,我也遇到了同样的问题。问题是操作系统。我使用Windows 10运行Kafka代理,消费者在配置为“read_committed”时看不到任何提交的事务,一旦我将代理移动到Linux,事务(和消费者)就开始工作。 顺便说一下,卡夫卡没有在日志中显示任何错误。
希望能有所帮助。我深入研究了这个问题,发现我的上一个稳定偏移量是45。但我在消费者端的当前偏移量是365。因此,read_Committed将仅从上一个稳定偏移量读取。当我将当前偏移量更改为30时,Kafka消费者开始使用read_Committed属性消费邮件。所以我的问题是为什么我的上一个稳定偏移量是365当我从该方提交事务时,卡夫卡制作人不会更新偏移量。props.put(“retries”,3);props.put(“retry.backoff.ms”,1000);props.put(“max.in.flight.requests.per.connection”,1);//如果大于1,它可以更改顺序或记录。客户端可以发送的最大未确认请求数。props.put(“enable.idemponence”,true);props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,“Transaction15”);private KafkaTemplate(){log.info(“Kafka Producer的实例化”);Producer=new KafkaProducer(initializeProducerProperties());Producer.initTransactions();}您是否有要发布的3节点kafka群集?是否正在创建复制因子为3的_事务_状态主题?此问题与操作系统无关。此问题与kafka producer提交消息的方式更相关。