Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Apache kafka 如何确保在ApacheStorm中处理kafka消息时只使用一次语义_Apache Kafka_Apache Storm - Fatal编程技术网

Apache kafka 如何确保在ApacheStorm中处理kafka消息时只使用一次语义

Apache kafka 如何确保在ApacheStorm中处理kafka消息时只使用一次语义,apache-kafka,apache-storm,Apache Kafka,Apache Storm,我需要在我的应用程序中只发送一次。我探索了卡夫卡,并意识到要让消息只产生一次,我必须在producer config中设置idemptence=true。这还会设置acks=all,使生产者重新发送消息,直到所有副本都提交了消息。为确保使用者不会重复处理或保留任何未处理的消息,建议在同一数据库事务中将处理输出和偏移量提交到外部数据库,以便两者都将被持久化或无,从而避免重复和无处理 在使用者中,若使用者首次提交消息但在处理之前失败,则消息将保持处理状态;若使用者首次处理消息但在提交之前失败,则消息

我需要在我的应用程序中只发送一次。我探索了卡夫卡,并意识到要让消息只产生一次,我必须在producer config中设置
idemptence=true
。这还会设置
acks=all
,使生产者重新发送消息,直到所有副本都提交了消息。为确保使用者不会重复处理或保留任何未处理的消息,建议在同一数据库事务中将处理输出和偏移量提交到外部数据库,以便两者都将被持久化或无,从而避免重复和无处理

在使用者中,若使用者首次提交消息但在处理之前失败,则消息将保持处理状态;若使用者首次处理消息但在提交之前失败,则消息将被多次处理

Q1.现在我在猜测如何模仿Apache Storm。我猜只要在
KafkaBolt
中设置
idemptence=true
,就可以确保消息的生成。我说得对吗

我在猜测如何确保在Storm中处理遗漏和重复的消息。例如,如果我锚定一个元组(通过将其作为第一个参数传递给
OutputCollector.emit()
),然后将该元组传递给
OutputCollector.ack()
OutputCollector.fail()
,Storm将确保数据丢失。这正是它所说的:

现在,您已经了解了可靠性算法,让我们回顾一下所有故障案例,看看Storm在每种情况下如何避免数据丢失:

  • 未确认元组,因为任务已结束:在这种情况下,失败元组树根处的喷口元组ID将超时并重新播放

  • Acker任务死亡:在这种情况下,Acker跟踪的所有喷口元组都将超时并重放

  • 喷口任务终止:在这种情况下,喷口与之对话的源负责重放消息。例如,当客户端断开连接时,Kestrel和RabbitMQ等队列将把所有挂起的消息放回队列


Q2.我想这可以确保消息不会未经处理,但不会避免重复处理消息。我说的对吗?另外,Storm还提供了其他任何东西来确保我所缺少的像kafka这样的语义只有一次吗?

关于Q1:是的,通过设置该属性,KafkaBolt可以从
KafkaBolt
获得相同的行为,KafkaBolt只需包装一个
KafkaProducer

关于消费端的语义,Storm的选项与Kafka相同。当您阅读来自卡夫卡的消息时,您可以选择在处理之前或之后提交(例如写入数据库)。如果您以前这样做,并且程序崩溃,您将丢失消息。让我们最多调用一次
处理
。如果在之后执行此操作,则如果程序在处理之后但在提交之前崩溃,则有可能处理同一消息两次,称为
,至少处理一次

因此,关于Q2:是的,使用锚定元组和acking将至少为您提供一次
语义。不使用锚定元组最多只会给您一次

是的,Storm还提供了一些其他功能来确保“Trident”的语义,但它要求您以不同的方式编写拓扑,并且您的数据存储必须与之相适应,以便能够执行消息重复数据消除。请参阅上的文档

还有一点要提醒您:当Storm(或Kafka)的文档只讨论一次语义时,会有一些关于您将要执行的处理类型的假设。例如,当Storm的Trident文档只讨论一次时,有一个假设,即您将调整您的数据库,以便在收到消息时确定该消息是否已存储。当卡夫卡的文档只讨论一次时,假设您的处理过程是从卡夫卡读取数据,进行一些计算(很可能没有副作用)然后回写给卡夫卡

这只是说,对于某些类型的处理,您可能仍然需要在
至少一次
最多一次
之间进行选择。如果可以使处理幂等,则至少一次
是一个不错的选择

最后,如果您的处理符合“从卡夫卡读取、执行计算、写入卡夫卡”模型,您可能会从卡夫卡流中获得比Storm更好的语义,因为Storm无法提供卡夫卡在这种情况下所能提供的唯一语义