我第一次使用Kafka处理实时消息。
使用src-attribute
偏移量,消息将是Sync
或comitted
,然后再从代理接收下一条消息。并且在failed to commit
偏移的情况下,无论最后一条消息是ASync
还是commited
都将被提交,下一条消息将被接收。
still pending
但是可以说,如果像上述示例一样我同时使用两个try {
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("topic = %s, partition = %s, offset = %d,
customer = %s, country = %s\n",
record.topic(), record.partition(),
record.offset(), record.key(), record.value());
}
consumer.commitAsync(); 1
}
} catch (Exception e) {
log.error("Unexpected error", e);
} finally {
try {
consumer.commitSync(); 2
} finally {
consumer.close();
}
}
,它将如何工作?
例如,在民意测验中如果我收到5条与Sync and ASync
偏移的消息,而其中的1 to 5
也得到处理和提交。但是对于1 and 2
发送的相同请求,来自3 to 5
的偏移量已处理但未提交,但被卡在网络中的某个地方。
所有提交请求将已经从ASync发送到代理,但是仅提交ASync
,然后在1 and 2
部分进行同步控制。它将尝试一一提交所有final
消息,直到失败或成功为止。但是,如果它仅在第三个偏移处失败,那么在重新平衡时,它将从哪里开始读取?
最新最早的将如何发挥作用?
如果将属性设置为Not-Committed
,那么消费者将在重新平衡后考虑哪个消息在经纪人中是最新的?因为latest
已经存在,但已经处理但尚未提交,再加上一些新消息,可以说3, 4, 5
偏移量。哪一个是最新的?是3号起还是6号起?
如果将属性设置为6, 7, 8
,那么在重新平衡之后,消费者将考虑哪个消息最早出现在代理中?消费者将从哪个偏移量开始阅读这些消息?
答案 0 :(得分:0)
仅当while循环中存在异常时,才会到达finally块,因此一次只发生一种提交类型
还请注意,您要提交的是完整批次,而不是在for循环中一一提交,默认max.poll.records = 500,那么这是您随时可以提交的最大偏移量
最新和最早将如何发挥作用
仅当不存在先前的组时才适用。
如果一个组存在并重新平衡,它总是从现有的偏移量恢复,而不使用此属性