【问题标题】:If I have Transactional Producer in Kafka can I read exactly once messages with Kafka Streams?如果我在 Kafka 中有 Transactional Producer,我可以使用 Kafka Streams 只读取一次消息吗?
【发布时间】:2018-11-14 20:35:52
【问题描述】:

我想要 Exactly-once 语义,但我不想使用 Consumer 读取消息。我宁愿用 Kafka Streams AP 阅读消息。如果我将 processing.guarantee=exactly_once 添加到 Stream 配置中,是否会保留恰好一次的语义?

【问题讨论】:

标签: apache-kafka kafka-consumer-api kafka-producer-api apache-kafka-streams


【解决方案1】:

Exactly-once 处理基于读取-处理-写入模式。 Kafka Streams 使用这种模式,因此,如果您编写一个常规的 Kafka Streams 应用程序将结果写回 Kafka 主题,您将获得一次性处理保证。

请注意,本保证不涵盖副作用。另请注意,如果失败,可能会在内部重试。恰好一次意味着,您在输出主题中看到的结果与没有发生错误(因此不会重试)相同。

有关更多详细信息,您可能希望观看有关 Kafka 中的完全一次保证的谈话录音。 Confluent 网页上有多个可用(免责声明:我是 Confluent 的员工)https://www.confluent.io/resources/

【讨论】:

  • 嗨,马蒂亚斯。我想我的问题不正确。我用 Transactional Producer 将消息写入主题。我假设如果我有幂等的 Kafka API 消费者——我会得到恰好一次的消息。如果我从使用 Transactional Producer 编写的同一主题中读取的不是 Idempotent Consumer,而是使用 Kafka Streams API 怎么办? Producer 和 Streams read 会有相同的事务吗?在使用来自事务生产者主题的 Streams 处理消息时,我希望只有一次
  • 没有什么比得上“幂等消费者”了。请注意,当您使用记录(使用 KafkaConsumer 或 Streams API)时,您看不到任何事务边界。阅读与这方面的交易无关。消费者和 Streams API 只能保证不返回中止的事务,但事务边界在读取路径上不可见。它类似于数据库:如果一个客户端更新了表中 5 行中的 2 行,则在提交之后,读取器无法判断事务修改了哪些行。事务不是写-读模式,而是读-进程-写模式。
  • 我想我只是完全误解了 Kafka 中的事务概念。那么当消费者提交偏移量为事务中的最后一条消息时,事务被视为已提交?在消费者读取事务中的最后一条消息之前,事务是否被视为已提交?
  • 一个事务完成,此时生产者提交事务。即,提交发生在写路径上,而不是读路径上。 Kafka 中的事务是原子多分区写入。请观看我指出的会谈录音。那里有解释。
  • 现在我明白了。感谢您的时间和耐心。也将观看讲座以获得更多了解!
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2019-07-02
  • 2019-01-04
  • 2020-06-19
相关资源
最近更新 更多