Spring-Kafka —— 消费重试机制实现
消息处理问题
在从Kafka主题接收消息之后立即处理消息的消费者的实现非常简单。不幸的是,现实要复杂得多,并且由于各种原因,消息处理可能会失败。其中一些原因是永久性问题,例如数据库约束失败或消息格式无效。其他,如消息处理中涉及的依赖系统的临时不可用,可以在将来解决。在这些情况下,重试消息处理可能是一种有效的解决方案。
非阻塞重试逻辑
在像Kafka这样的流媒体系统中,我们不能跳过消息并在以后回复它们。一旦我们移动当前消息中指向Kafka的指针,我们就无法返回。为简单起见,我们假设消息偏移在成功的消息处理之后就被记住了。在这种情况下,除非我们成功处理当前消息,否则我们无法接收下一条消息。如果处理单个消息不断失败,则会阻止系统处理下一条消息。很明显,我们希望避免这种情况,因为通常一次消息处理失败并不意味着下一次消息处理失败。此外,在较长时间(例如一小时)之后,由于各种原因,失败消息的处理可能成功。对他们来说,我们所依赖的系统可以再次出现。
在消息处理失败时,我们可以将消息的副本发布到另一个主题并等待下一条消息。让我们将新主题称为'retry_topic'。'retry_topic'的消费者将从Kafka接收消息,然后在开始消息处理之前等待一些预定义的时间,例如一小时。通过这种方式,我们可以推迟下一次消息处理尝试,而不会对'main_topic'消费者产生任何影响。如果'retry_topic'消费者中的处理失败,我们只需放弃并将消息存储在'failed_topic'中,以便进一步手动处理此问题。
业务重试场景
现在让我们考虑以下场景。一条新消息被写入主题'main_topic'。如果此消息的处理失败,那么我们应该在5分钟内再次尝试。我们怎么做?我们应该向'retry_topic'写一条新消息,它包装失败的消息并添加2个字段:
- 'retry_number',值为1
- 'retry_timestamp',其值计算为现在+ 5分钟
这意味着'main_topic'使用者将失败的消息处理的责任委托给另一个组件。'main_topic'消费者未被阻止,可以接收下一条消息。'retry_topic'消费者将立即收到'main_topic'消费者发布的消息。它必须从消息中读取'retry_timestamp'值并等到那一刻,阻塞线程。线程唤醒后,它将再次尝试处理该消息。如果成功,那么我们可以获取下一个可用消息。否则我们必须再次尝试。我们要做的是克隆消息,递增'attempt_number'值(它将为2)并将'retry_timestamp'值设置为now + 5分钟。消息克隆将再次发布到'retry__topic。
如果我们到达重试最高次数。现在是时候说“停止”了。我们将消息写入'failed_topic'并将此消息视为未处理。有人必须手动处理它。
下面的图片可以帮助您理解消息流:
总结
正如您所注意到的,在发生某些故障时实施推迟消息处理并不是一件容易的事情。请记住:
- 可以仅按顺序从主题分区中使用消息
- 您不能跳过消费并稍后再处理此消息
- 如果要推迟处理某些消息,可以将它们重新发布到单独的主题,每个延迟值一个
- 处理失败的消息可以通过克隆消息并将其重新发布到重试主题之一来实现,其中包含有关尝试次数和下次重试时间戳的更新信息
- 除非是时候处理消息,否则重试主题的消费者应该阻止该线程
- 重试主题中的消息按时间顺序自然组织,必须按顺序处理
问题
Spring-Kafka —— 消费重试机制实现的更多相关文章
- Spring Cloud 请求重试机制核心代码分析
场景 发布微服务的操作一般都是打完新代码的包,kill掉在跑的应用,替换新的包,启动. spring cloud 中使用eureka为注册中心,它是允许服务列表数据的延迟性的,就是说即使应用已经不在服 ...
- 一文详解Spring Cloud Feign重试机制
前言 Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的.Feign使用的是Spring Retry组件,需要引入依赖才能启用. 一.POM引入Sprin ...
- Spring Cloud Gateway重试机制
前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊 ...
- Spring Cloud学习 之 Spring Cloud Ribbon 重试机制及超时设置不生效
今天测了一下Ribbon的重试跟超时机制,发现进行的全局超时配置一直不生效,配置如下: ribbon: #单位ms,请求连接的超时时间,默认1000 ConnectTimeout: 500 #单位ms ...
- Spring Kafka和Spring Boot整合实现消息发送与消费简单案例
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...
- Spring Cloud重试机制与各组件的重试总结
SpringCloud重试机制配置 首先声明一点,这里的重试并不是报错以后的重试,而是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例. ? 1 2 3 4 5 6 7 8 @Bean @Lo ...
- Kafka消费与心跳机制
1.概述 最近有同学咨询Kafka的消费和心跳机制,今天笔者将通过这篇博客来逐一介绍这些内容. 2.内容 2.1 Kafka消费 首先,我们来看看消费.Kafka提供了非常简单的消费API,使用者只需 ...
- Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...
- 涨姿势了解一下Kafka消费位移可好?
摘要:Kafka中的位移是个极其重要的概念,因为数据一致性.准确性是一个很重要的语义,我们都不希望消息重复消费或者丢失.而位移就是控制消费进度的大佬.本文就详细聊聊kafka消费位移的那些事,包括: ...
随机推荐
- 3. caffe中 python Notebook
caffe官网上的example中的例子,如果环境配对都能跑出来,接下来跑Notobook Example中的程序,都是python写的,这些程序会让你对如何使用caffe解决问题有个初步的了解(ht ...
- C# 字符串和正则表达式(8) 持续更新
创建字符串 如果多次修改一个字符串或创建一个很长的字符串,用String类会效率低下.这种情况,可以用 System.Text.StringBuilder ,它专门为这种情况设计的. 格式化表达式 格 ...
- iphone bandwidth
iPhone 8, 8 Plus, X peak throughput of ~24GBs iPhone XS, XS Max, XR peak throughput of ~34GBs 在iphon ...
- 如何实现swipe、tap、longTap等自定义事件
前言 移动端原生支持touchstart.touchmove.touchend等事件,但是在平常业务中我们经常需要使用swipe.tap.doubleTap.longTap等事件去实现想要的效果,对于 ...
- 串口+RS485驱动
其实RS485不算什么协议,只是物理层做了差分传输,AB两线的电压差来表示0,1,0,1,可靠性和距离更加好,因此,一个串口外设只能作为半双工使用,而RS232是可以全双工的. max485模块可以直 ...
- vue 多层组件相互嵌套的时候 数据源更新 dom没更新 彻底清除组件缓存
当项目中存在多层组件相互嵌套 组件存在严重缓存时 this.$nextTick(() => { ..... }); 不管用 this.$forceUpdate(); 不管用 只能通过深拷贝浅拷 ...
- [codeforces792C][dp]
https://codeforc.es/contest/792/problem/C C. Divide by Three time limit per test 1 second memory lim ...
- http communication process
- joxj 模拟赛 2019年9月3日
比赛题目来源:2018qbxt合肥Day1 T1 最小公倍数 题意:已知正整数n,求n与246913578的最小公倍数,结果对1234567890取模 数据范围:1<=n<=1010000 ...
- 【转载】从头到尾彻底理解KMP
转自:http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月 ...