Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 如何使用手动确认卡夫卡消息的指数回退_Apache Kafka_Spring Kafka - Fatal编程技术网

Apache kafka 如何使用手动确认卡夫卡消息的指数回退

Apache kafka 如何使用手动确认卡夫卡消息的指数回退,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我有一个Springboot项目,它接收关于卡夫卡主题的消息。应用程序本身相当简单 收到消息 对另一个服务执行REST请求 成功后确认消息 如果由于任何原因,REST请求失败,将执行无限指数退避以继续尝试REST请求(消息有一个过期时间,超过该时间将被丢弃以防止消息永久重试) 情景: 接收到一条消息,该消息未通过REST请求,并处于重试循环中(偏移量1)。 接收到另一条成功的消息(偏移量2)。第二条消息确认该消息,因为它成功地将分区偏移量设置为2 如果应用程序在此场景中崩溃或停机,当它返回时,消

我有一个Springboot项目,它接收关于卡夫卡主题的消息。应用程序本身相当简单

  • 收到消息
  • 对另一个服务执行REST请求
  • 成功后确认消息
  • 如果由于任何原因,REST请求失败,将执行无限指数退避以继续尝试REST请求(消息有一个过期时间,超过该时间将被丢弃以防止消息永久重试)

    情景: 接收到一条消息,该消息未通过REST请求,并处于重试循环中(偏移量1)。 接收到另一条成功的消息(偏移量2)。第二条消息确认该消息,因为它成功地将分区偏移量设置为2

    如果应用程序在此场景中崩溃或停机,当它返回时,消息(偏移量1)将丢失

    我可以做些什么来确保确认是连续的?重放消息不成问题,因为存在由跟踪消息状态的数据库支持的重复数据消除逻辑

    实现了无限指数退避以继续尝试REST请求

    接收到另一条成功的消息(偏移量2)

    如果通过侦听器容器的
    SeekToCurrentErrorHandler
    中配置的
    ExponentialBackOff
    实现无限重试,则不会发生这种情况


    您将始终获得重新交付的补偿1,直到成功;在此之前,您不会看到偏移量2。

    谢谢您的回答,我非常感谢。当您提到“在此之前您将不会看到偏移量2”时,是否意味着整个应用程序将在重试的消息上被阻止?我们的目标是不断重试失败的消息,但不会阻止那些在尝试后会成功的消息。您将能够从其他分区接收消息(如果您的并发性>1),但无法从当前分区的较低位置接收消息。如果异步处理记录,则可以这样做,但这将带来管理偏移量的噩梦。通过添加分区,卡夫卡可以最好地实现并发性。这就是说,如果您的rest服务关闭,那么它将全部关闭。如果您有一个多代理群集,并且您在不同的实例上有多个分区,那么即使是单个使用者(并发性=1)也可能会取得进展,因为失败的记录并不总是第一个交付的记录。