同步和异步如何同时工作

时间:2020-03-19 12:45:34

标签: java apache-kafka

我第一次使用Kafka处理实时消息。

使用src-attribute偏移量,消息将是Synccomitted,然后再从代理接收下一条消息。并且在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,那么在重新平衡之后,消费者将考虑哪个消息最早出现在代理中?消费者将从哪个偏移量开始阅读这些消息?

1 个答案:

答案 0 :(得分:0)

仅当while循环中存在异常时,才会到达finally块,因此一次只发生一种提交类型

还请注意,您要提交的是完整批次,而不是在for循环中一一提交,默认max.poll.records = 500,那么这是您随时可以提交的最大偏移量

最新和最早将如何发挥作用
仅当不存在先前的组时才适用。

如果一个组存在并重新平衡,它总是从现有的偏移量恢复,而不使用此属性