Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果断电,卡夫卡的信息会丢失吗?_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 如果断电,卡夫卡的信息会丢失吗?

Java 如果断电,卡夫卡的信息会丢失吗?,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我有一个关于卡夫卡进程如何失败的理论问题。 假设我们只有1个分区和2个使用者。我知道不太可能出现这种情况,但举个例子,我真的想更好地理解它。我已经启用了自动提交和一点提交间隔 分区是: P: M1, M2, M3 其中M1、M2和M3是具有其偏移量(1、2、3)的消息 假设如下: T1: M1, M2 - failed T2: M3 这意味着工人(线程)1获得了M1并成功地处理了它,但在处理M2时失败了。例如,断电或某些硬件问题。但它在失败之前提交了补偿2(顺便说一句,这可能吗?)。线程2得

我有一个关于卡夫卡进程如何失败的理论问题。 假设我们只有1个分区和2个使用者。我知道不太可能出现这种情况,但举个例子,我真的想更好地理解它。我已经启用了自动提交和一点提交间隔

分区是:

P: M1, M2, M3
其中M1、M2和M3是具有其偏移量(1、2、3)的消息

假设如下:

T1: M1, M2 - failed
T2: M3
这意味着工人(线程)1获得了M1并成功地处理了它,但在处理M2时失败了。例如,断电或某些硬件问题。但它在失败之前提交了补偿2(顺便说一句,这可能吗?)。线程2得到了M3,成功地处理了它并提交了偏移量3

结果,我们丢失了M2消息。 问题是——这可能吗?如果问题是显而易见的,请提前道歉。

引用优秀文章:

在开始讨论一致性和可用性之前,请保持 记住,只要你生产一个,这些保证就可以得到 分区和从一个分区消费所有担保均已关闭 如果您正在使用两个使用者或 使用两个生产者写入同一分区。

因此,对于两个使用者,您不能期望访问在处理过程中丢失的消息。但是,如果您坚持使用一个消费者并使用“至少一次消息传递”模式,则:

至少 一旦交付,使用者从分区读取数据,处理 消息,然后提交它已处理的消息的偏移量。 In在这种情况下,消费者可能会在处理消息之间崩溃 提交偏移量,当使用者重新启动时,它将 再次处理邮件。这会导致邮件在中重复 下游系统,但无数据丢失

引用优秀文章:

在开始讨论一致性和可用性之前,请保持 请记住,只要您生产一台,这些保证就有效 分区和从一个分区消费所有担保均已关闭 如果您正在使用两个使用者或 使用两个生产者写入同一分区。

因此,对于两个使用者,您不能期望访问在处理过程中丢失的消息。但是,如果您坚持使用一个消费者并使用“至少一次消息传递”模式,则:

至少 一旦交付,使用者从分区读取数据,处理 消息,然后提交它已处理的消息的偏移量。 In在这种情况下,消费者可能会在处理消息之间崩溃 提交偏移量,当使用者重新启动时,它将 再次处理邮件。这会导致邮件在中重复 下游系统,但无数据丢失


卡夫卡保证消息传递至少一次。但你永远不会丢失信息

你说的情况永远不会发生。除非读取消息,否则无法提交偏移量。您已打开自动提交。这只是说,您将提交每个固定时间间隔的偏移量。这并不意味着偏移量将在不读取消息的情况下向前移动。卡夫卡保证


卡夫卡保证消息至少传递一次。但你永远不会丢失信息

你说的情况永远不会发生。除非读取消息,否则无法提交偏移量。您已打开自动提交。这只是说,您将提交每个固定时间间隔的偏移量。这并不意味着偏移量将在不读取消息的情况下向前移动。卡夫卡保证


我说的是外部问题。假设有一种情况,消费者从分区中获取一条消息,然后提交。刚刚过去。然后砰!断电,消费者死亡。消息丢失了吗?因为提交已完成,因为消息已从日志中提取。但它并没有被成功处理。但“至少一次”策略看起来不错,是的——它将防止这种情况。谢谢你的回答!如果您认为这样的场景是完全可能的,那么您必须执行手动提交。只有在处理完邮件后才提交。我指的是外部问题。假设有一种情况,消费者从分区中获取一条消息,然后提交。刚刚过去。然后砰!断电,消费者死亡。消息丢失了吗?因为提交已完成,因为消息已从日志中提取。但它并没有被成功处理。但“至少一次”策略看起来不错,是的——它将防止这种情况。谢谢你的回答!如果您认为这样的场景是完全可能的,那么您必须执行手动提交。只有在处理完邮件后才提交。很棒的文章!“如果使用者在提交偏移量和处理消息之间崩溃,它将从下一个偏移量重新启动,而从未处理过消息。这将导致潜在的不希望的消息丢失。”–正是我所说的。谢谢顺便问一下,你知道在使用KafkaConsumer时使用多个工作线程是一个好主意吗?当每个线程在同一个主题上调用“民意测验(100)”和“提交SysCo()”时,会发生什么?@ TMN4JQ,我们使用C++客户端(EdHiNeule/LabdKaFKA),所以我不熟悉java API的细节。然而,我强烈建议增加分区的数量,每个分区有一个消费者——这给了我们最好的结果。当然,您可以有一个KafkaConsumer和多个worker线程来处理接收到的消息,但在这种情况下,您必须注意提交消息的顺序和同步,Kafka已经提供了现成的功能。@tmn4jq顺便说一句,这可能很有帮助:很棒的文章!“如果消费者在提交补偿和处理me之间崩溃