Apache kafka 卡夫卡如何保证消费者不会';我一条信息都看不两遍吗?

Apache kafka 卡夫卡如何保证消费者不会';我一条信息都看不两遍吗?,apache-kafka,Apache Kafka,卡夫卡如何保证消费者不会将一条信息读两遍 或者上述情况是否可能? 同一条信息能被一个或多个消费者阅读两次吗?准确地说,卡夫卡保证: Kafka提供分区中消息的顺序保证 生成的消息在写入分区的所有同步副本时被视为“已提交” 只要至少有一个副本保持活动状态,提交的消息就不会丢失 使用者只能读取已提交的邮件 关于消费消息,消费者通过保存内部压缩的Kafka主题中读取的最后一个偏移量来跟踪分区中的进度 如果启用了enable.auto.commit,卡夫卡消费者可以自动提交偏移量。然而,这将给出“最多一

卡夫卡如何保证消费者不会将一条信息读两遍

或者上述情况是否可能?
同一条信息能被一个或多个消费者阅读两次吗?

准确地说,卡夫卡保证:

  • Kafka提供分区中消息的顺序保证
  • 生成的消息在写入分区的所有同步副本时被视为“已提交”
  • 只要至少有一个副本保持活动状态,提交的消息就不会丢失
  • 使用者只能读取已提交的邮件
  • 关于消费消息,消费者通过保存内部压缩的Kafka主题中读取的最后一个偏移量来跟踪分区中的进度


    如果启用了
    enable.auto.commit
    ,卡夫卡消费者可以自动提交偏移量。然而,这将给出“最多一次”的语义。因此,通常会禁用该标志,并且开发人员在处理完成后显式提交偏移量。

    如果不使消费进程幂等,则绝对可能


    比如,;您正在实现至少一个传递语义,首先处理消息,然后提交偏移量。由于服务器故障或重新平衡,可能无法提交偏移量。(可能您的消费者当时已被吊销)因此,当您进行投票时,您将收到两次相同的消息。

    有许多情况会导致消费者使用重复的消息

  • 生产者已成功发布消息,但未能确认重试同一消息的原因
  • 生产者发布了一批消息,但部分发布的消息失败。在这种情况下,它将重试并再次重新发送同一批,这将导致重复
  • 使用者从Kafka接收一批消息并手动提交其偏移量(enable.auto.commit=false)。 如果消费者在提交卡夫卡之前失败,下次消费者将再次使用相同的记录,这些记录会在消费者端复制副本
  • 为了保证不使用重复的消息,作业的执行和提交偏移量必须是原子的,以保证在使用者端仅使用一次传递语义。 您可以使用下面的参数来实现一个语义。但请您理解,这是与性能的折衷

  • 在producer端启用幂等性,保证不会两次发布同一消息 enable.idemponence=true
  • 已提交已定义的事务(隔离.level) 隔离级别=已提交读取
  • 在卡夫卡流中,可以通过精确设置一次来实现上述设置 语义为true,使其成为单位事务

    幂等元

    幂等传递使制作者能够在单个制作者的生命周期内将消息准确地写入Kafka到主题的特定分区一次,而不会丢失数据和每个分区的顺序

    事务(隔离级别)

    事务使我们能够在多个主题分区中自动更新数据。事务中包含的所有记录都将成功保存,或者不会保存任何记录。它允许您在同一事务中提交消费者偏移量以及已处理的数据,从而允许端到端仅一次语义

    生产者不等待向Kafka写入消息,而生产者使用beginTransaction、commitTransaction和abortTransaction(如果失败),消费者使用隔离。级别为read_committed或read_uncommitted

    • read_committed:使用者将始终仅读取提交的数据
    • read_uncommitted:按偏移顺序读取所有邮件,无需等待 对于要提交的事务

    请更详细地参考

    我想你的意思是:“在服务器故障或重新平衡的情况下,这是绝对可能的。如果你不让你的消费过程幂等,你可能会遇到麻烦”@J.J.Beam我看不出区别:)你应该让你的消费过程幂等,以避免重复。这就是我所说的。我想只有当生产者端的“acks=all”时,第二个才是正确的。但消费者仍然可以消费两次?