背景

在kafka的消费者中,如果消费某条消息出错,会导致该条消息不会被ack,该消息会被不断的重试,阻塞该分区的其他消息的消费,因此,为了保证消息队列不被阻塞,在出现异常的情况下,我们一般还是会ack该条消息,再另外对失败的情况进行重试

目标

实现一个完善的重试逻辑,一般需要考虑一下几个因素:

  1. 重试的时间间隔
  2. 最大重试次数
  3. 是否会漏掉消息

实现

扔回队尾

在消息出错时,将消息扔回队尾

优点:

  1. 实现简单,没有别的依赖项

缺点:

  1. 无法控制重试时间间隔

基于数据库任务表的扫描方案

在数据库中增加一个任务的状态表,然后用一个定时任务去扫描任务表中,失败的任务,然后进行重试,其中记录下重试的次数即可

优点:

  1. 实现简单,一般这种离线任务,根据统计的需求,都会有一个任务状态表的,所以仅仅是增加一个定时任务去扫表

缺点:

  1. 性能较差,定时任务,一般都在无意义的扫描,浪费性能

新增重试队列的方案

新增一个重试队列,消费消息出错时,将时间戳和消息发送到重试队列,然后在重试队列中,根据时间,来判断阻塞时间,代码如下:

func handleRetryEvent(ctx context.Context, conf *util.Conf, data []byte) (err error) {
defer common.Recover(ctx, &err)
log := common.Logger(ctx).WithField("Method", "consumer.handleRetryEvent")
retryEvent := &MergeRetryEvent{}
err = json.Unmarshal(data, retryEvent)
if err != nil {
log.WithError(err).Error("failed to unmarshal data")
return nil
}
log.WithField("contact_id", retryEvent.ContactId).Info("receive message")
delaySecond := (retryEvent.CreateTime + SLEEPSECOND) - time.Now().Unix()
if delaySecond <= 0 {
log.Info("send message to account merge event")
err = SendAccountMergeEventTopic(ctx, retryEvent.ContactId)
return err
} else {
log.Infof("sleep %d seconds", delaySecond)
time.Sleep(time.Duration(delaySecond) * time.Second)
err = SendAccountMergeEventTopic(ctx, retryEvent.ContactId)
return err
}
}

优点:

相对于扫表的方案,改方案没有无意义的扫表操作,性能更好

注意:之前在网上看到一个重试队列的实现,因为害怕开过多的线程(协程),作者用了一个channel来缓存重试消息,然后在一个协程池中去消费消息,消费的逻辑和上面的实例代码差不多,这样做是有风险的,因为channel是在本机的内存中,没有本地存储的,是存在丢消息的风险的(服务重启等情况)

参考链接:

https://blog.pragmatists.com/retrying-consumer-architecture-in-the-apache-kafka-939ac4cb851a

kafka消费者重试逻辑的实现的更多相关文章

  1. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  2. Kafka集群安装部署、Kafka生产者、Kafka消费者

    Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...

  3. kafka消费者客户端

    Kafka消费者 1.1 消费者与消费者组 消费者与消费者组之间的关系 ​ 每一个消费者都隶属于某一个消费者组,一个消费者组可以包含一个或多个消费者,每一条消息只会被消费者组中的某一个消费者所消费.不 ...

  4. 带你涨姿势的认识一下 Kafka 消费者

    之前我们介绍过了 Kafka 整体架构,Kafka 生产者,Kafka 生产的消息最终流向哪里呢?当然是需要消费了,要不只产生一系列数据没有任何作用啊,如果把 Kafka 比作餐厅的话,那么生产者就是 ...

  5. Kafka 消费者

    应用从Kafka中读取数据需要使用KafkaConsumer订阅主题,然后接收这些主题的消息.在我们深入这些API之前,先来看下几个比较重要的概念. Kafka消费者相关的概念 消费者与消费组 假设这 ...

  6. 5.Kafka消费者-从Kafka读取数据(转)

    http://www.dengshenyu.com/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/11/14/kafka-consumer.ht ...

  7. Kafka 消费者解析

    一.消费者相关概念 1.1 消费组&消费者 消费者: 消费者从订阅的主题消费消息,消费消息的偏移量保存在Kafka的名字是__consumer_offsets的主题中 消费者还可以将⾃⼰的偏移 ...

  8. kafka消费者客户端(0.9.0.1API)

    转自:http://orchome.com/203 kafka客户端从kafka集群消费消息(记录).它会透明地处理kafka集群中服务器的故障.它获取集群内数据的分区,也和服务器进行交互,允许消费者 ...

  9. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

随机推荐

  1. vue 开发规范

    本文档为前端 vue 开发规范 规范目的 命名规范 结构化规范 注释规范 编码规范 CSS 规范 规范目的 为提高团队协作效率 便于后台人员添加功能及前端后期优化维护 输出高质量的文档 命名规范 为了 ...

  2. JDK14的新特性

    文章目录 虽然JDK13在今年的9月17号才发布,但是丝毫不会影响到下一个版本JDK14的开发工作.听说官方定的新功能马上就要官宣了,我们这里不妨来提前推断一下. 在9月17号的发布中,Oracle提 ...

  3. OC的消息机制简单介绍

    在OC的消息机制中主要分为三个阶段,分别为: 1.消息发送阶段:从类以及父类的方法缓存列表和方法列表查找方法. 2.动态解析阶段:在消息发送阶段没有找到方法,则会进入这个阶段,负责动态添加方法实现. ...

  4. 小白的MyBatis逆向工程

    MyBatis逆向工程   MyBatis逆向工程,简称MBG.是一个专门为MyBatis框架使用者定制的代码生成器. 可以快速的根据数据库表生成对应的映射文件,接口,以及Bean类对象. 在Myba ...

  5. MySQL Change Data Directory

    为什么80%的码农都做不了架构师?>>>   Stop MySQL using the following command: sudo /etc/init.d/mysql stop ...

  6. 更改 vsftpd 的端口号

    2019独角兽企业重金招聘Python工程师标准>>> vsftpd启动后,默认的ftp端口是21,现在我想把ftp端口改成 801 ,修改后能保证用户上传下载不受影响 1.编辑 / ...

  7. Codeforces 1291 Round #616 (Div. 2) B

    B. Array Sharpening time limit per test1 second memory limit per test256 megabytes inputstandard inp ...

  8. 多线程高并发编程(7) -- Future源码分析

    一.概念 A Future计算的结果. 提供方法来检查计算是否完成,等待其完成,并检索计算结果. 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪. 取消由cancel方法执行 ...

  9. 怎么成为一名WEB前端开发工程师

       对于刚开始学的人来说,web 就是HTML+CSS+JavaScript其实我们是可以这样理解的.web工程师负责或参与Web产品的页面开发,包含PC端.移动APP内嵌移动端.微信小程序.web ...

  10. 揭露.net培训结构软谋收钱踢学员的套路

    本人以下文章全部真实,希望管理员能通过,给更多的.net学者一个警示,避免更多的.neter掉入泥坑. 本人小码农一枚,主要做.net方向,苦于进步无门,各种资料收集渠道受限,最后狠心花一个月工资报名 ...