如何为原子卡夫卡消费者设置卡夫卡生产者属性

时间:2019-10-25 09:48:56

标签: apache-kafka

我正在浏览this article,其中解释了如何通过执行以下操作来确保对消息进行一次准确的处理:

  • 启动/重新启动时从数据库读取(主题,分区,偏移量)
  • 从特定(主题,分区,偏移量)读取消息
  • 以原子方式执行以下操作(例如,在同一数据库事务中):
    • 正在处理消息
    • 将数据库的偏移量作为(主题,分区,偏移量)提交
    • 通过调用consumer.commitAsync()consumer.commitSync()手动向Kafka提交偏移量

我的疑问是为不同的消费者属性设置不同的值会产生什么影响

  1. enable.auto.commit
    我应该如何设置此属性? true还是false? Article说我们应该将其设置为false。但是,如果将其设置为true,会发生什么错误呢?在此,我将偏移量保存到外部数据库。因此,崩溃后,使用者在线时,将从数据库中保存的偏移量开始消耗。因此,我觉得此属性的值对启动/重新启动没有影响。
    我也不认为在单个使用者运行中此属性的不同值会产生任何影响,因为使用offset来读取下一条消息,并且无论我们手动还是自动提交都没有影响(它仍然是相同的offset)。

  2. auto.offset.reset
     此属性latestearliest有两个主要值。如果设置为latest,它将使使用者读取之后(即在启动使用者之后)发送的消息。如果设置为earliest,它将使消费者从第一条未读邮件中读取。由于这都影响消费者从启动时应从何处开始阅读消息,因此我认为此属性也不会对本文中指定的原子消费者产生任何影响。这是因为在此实现中,新启动的使用者开始从数据库中指定的偏移量中读取消息。

我对上述两种想法都正确吗?

2 个答案:

答案 0 :(得分:0)

如果使用Kafka Stream,它支持完全一次流模式,则可以参考

  

仅一次执行流模式就是执行   读过程写操作恰好一次。意味着你消耗一个   一次获取消息并获取过程并发布到另一个主题,并且   承诺。因此提交将由Stream自动处理一条消息   时间。

如果您不使用需要用Kafka提供的提交更好的特定用例,则您需要手动处理许多失败情况,例如如果发生数据库连接问题,以及处理百万或记录其所需的非常频繁的数据库访问,发生了什么。Kafka已经存储了已提交的偏移量,这在性能方面更好,不需要任何外部数据库连接。

  

_consumer_offsets存储有关每个主题,每个消费者组分区的承诺偏移量的信息。哪个使用提交来更新有关此主题的偏移量详细信息

如果您有特定的用例,需要进行原子交易,或者您希望将偏移量细节保持在结果附近,则可以按照here

来管理外部偏移量存储

启用.auto.commit: 如果使用外部偏移量管理,则不会使用提交方案,因此enable.auto.commit是启用还是禁用都没有关系。您将继续使用seek(TopicPartition partition,long offset)方法获取消息,并在外部存储偏移量。如果重新启动,则开始获取最新存储的偏移量。如果某些内置仪表板(例如Confluent Control-Center,Grafana等)用于维护Kafka主题,则只有在未手动提交且enable.auto.commit为false的情况下才会反映出来。

自动偏移重置 是的,它只会在您第一次启动时产生影响,但是由于您是用来从特定分区中获取消息并且不会产生影响而造成的。

======================已更新==================== ===

  

enable.auto.commit-如果为true(默认值),则定期提交偏移量   最后一条消息传递给应用程序。承诺的偏移量将   在进程重新启动以从上次中断的地方开始使用。

     

auto.commit.interval.ms-该频率以毫秒为单位   消费者偏移量被提交(写入)到偏移量存储中。

     

注意:如果enable.auto.commit false不会使用auto.commit.interval.ms

在enable.auto.commit情况下,每次提交都会调用true提交方法,如果auto.commit.interval.ms传递了偏移量,则将提交

  1. 轮询间隔>提交间隔:轮询间隔时间的偏移提交
  2. 轮询间隔<提交间隔:每次提交轮询都会调用Commit方法,但是在经过提交间隔后,Offset将在连续的poll()上提交。

答案 1 :(得分:0)

  1. enable.auto.commit
    使用者在崩溃后重新启动时,它将开始使用从数据库获取的偏移量中的主题分区。与任何其他情况一样,此属性的值将在单个无故障运行的消费者中使用。

    自动提交使使用者每隔5秒(默认值为auto.commit.interval.ms)或每进行一次poll()调用都进行提交。

    手动提交(enable.auto.commit=false)有助于避免不处理消息。例如,如果自动提交的5秒计时器在读取和处理消息之间到期,则可能最终会依次执行:(read, commit, process)。而且,如果使用者在提交后崩溃,而不处理消息(read,commit,crash),则该消息将永远不会被处理,因为在下一个poll()上,使用者将获取下一条消息(因为提交成功)。我们可以通过按以下顺序进行手动提交来防止这种情况:(read, process,commit)

    但是,在这种情况下,消费者有可能在处理后不提交(read,process,crash)而崩溃。这将导致在下一个poll()上重新处理相同的消息。

    为避免重复处理,我们将偏移量存储在外部数据库中,并在使用者重启时获取偏移量。请注意,将偏移量存储到数据库并在使用者重启时获取偏移量,还可以避免在(read,commit,crash)序列的情况下不处理消息,而在自动提交的情况下可能会发生这种情况。

    因此,简而言之,当我们将偏移存储到外部数据库时,手动提交没有任何作用。因此,我们可以将enable.auto.commit设置为任何truefalse。但是,当设置为false时,我们不应忘记显式提交。否则,消费者将继续阅读和处理相同的消息。

  2. auto.offset.reset

    当数据库中给定主题分区没有偏移值时,其值将产生影响。第一次启动使用者时或数据库被截断时,就会发生这种情况。在这种情况下,我们需要消费者从第一条消息开始消费,而第一条消息未被其消费组中的任何消费者消费。为此,我们需要将属性设置为earliest