一,漫谈消息队列

众所周知,消息队列主要是用于消峰,解藕。同时也使得业务的处理方式为异步处理。常用的消息队列有rabbitmq,activemq,rocketmq,kafka等等,考虑到Kafka已经集成到了spring,因此在Java作为主要开发语言的场景,kafka的使用是最为常见的。在消息队列中通常有两种角色:生产者与消费者。而联系两者之间的枢纽则称为队列。考虑到多个队列的存在,每个队列通常都有一个ID进行区分。

二,kafka的基本概念与相当重要的offset

topic:在上一节说明每个队列有个ID,那么这个就是kafka队列的ID。

partition:分区是针对生产者而言,每个topic可以有多个分区,生产者发送消息分别发送到不同的分区。

group:分组是针对消费者而言,每个topic可以有多个分组,kafka能保证相同的topic和分区只能一个分组中同一个消费者消费,因此需要重复消费就必须另一个分组。

at most onece模式:消息最多消费一次。

at least onece模式:消息最少消费一次。

exactly onece模式:消息恰好消费一次,冥等。

offset:我们知道消费者需要记录消费进度,那么这个关键的属性就是offset,offset有手动提交和自动提交两种方式,而这两种方式和消息的前两种模式息息相关,本文暂不做解释。笔者采用的是自动提交的方式。

三,注解KafkaListener不起作用

笔者是采用springboot的方式使用kafka,具体搭建方法不了解可自行谷歌。而作为消费者处理通常为方法上注解KafkaListener。

现象:使用kafkamanager对comsumer进行查看:

% of partitions assigned to comsume 100

total lag 8

logsize 51 offset 43

同时,注解了KafkaListener的方法中的处理结果查询不到。再发送一条消息,发现lag和logsize均增加1,而offset依然为43。

一定是提交offset的设置改为手动提交了,而又粗心忘记写提交代码,这是笔者的第一反应,赶紧查看cloud config的配置文件,明晃晃地写着enable-auto-commit: true,一万点暴击。

笔者当然不会死心,第二个想法浮出脑海,处理超时导致无法正确提交offset,先改超时时长尝试,如果可以的话,处理改为压入任务队列或者线程池异步处理。一通修改和刷新操作,终于把cloud config改完了,然而理想丰满现实骨感,老问题依旧,再次一万点暴击。

最直接方式吧,远程调试,因为内测阶段可以任性。当然此步骤改为阿尔萨斯诊断也是可以的,只是略微繁琐些。注解的方法根本没有进去。这下一滴冷汗落在了地上,什么提交offset那都是镜中花水中月了。可是为什么comsumer是健康的状态呢。

查kafka和zookeeper的状态,重置manager,真是一顿操作猛如虎,现实结果二百五。

这下陷入好一阵子的迷茫,还好笔者不服输。查看和调试spring的源码,第一个断点选在了kafkacomsumer的方法poll中的comsumerrecords不为空的分支处,再次发送消息,命中断点!!心中总算泛起了一片曙光。单步进行调试,一开始的想法是一定是注解的方法没有被listener invoke。似乎一切都按照预想的步骤进行着

kafkacomsumer的poll→

KafkaMessageListenerContainer的invokeListener,而且records也是一个元素并且topic也正确,这又是为啥呢?我点开了records的元素,一个震惊的画面浮现在我面前key为null,value也是为null。豁然开朗,要么消息序列化失败,要么消息反序列化失败。查看序列化类kyro,笔者虽然蛮不喜欢这玩意,因为不跨语言,所以不如protobuf等,但是前任CTO选择的也无不可。先换吧,改成ObjectMapper的json先。结果出人意料还是不行!看来错怪了kyro。那么为啥呢,发送的对象是jsonobject,会不会和这个相关呢?抱着试试看的态度,换成class,成功了!!久违的结果啊。看了看手机已经很迟了,那还是先让大家回家吧。猜测和setAccessible有点关系,未证实,有答案的朋友要不吝赐教。共同进步。

到此问题终于解决了,希望读者也别再踏这个看似offset的坑。

bootstrap-switch 不起作用 class处显示代码_注解KafkaListener不起作用,到底发生了啥?...相关推荐

  1. bootstrap-switch 不起作用 class处显示代码_GTJ2018高频问题解答——第六弹:梁加腋箍筋显示、梁钢筋报表查看等问题...

    点击上方蓝字关注我们,记得"星标"或"置顶"呦~ 梁 本期问题主要有: 梁加腋箍筋显示.梁钢筋报表查看.钢筋量与报表量不对应.渐变厚度筏板.悬挑梁钢筋量调整.悬 ...

  2. wpf时间显示代码_如何在ASP.NET和WPF中显示QR代码

    wpf时间显示代码 I've half-jokingly said that there's never a good reason to use a QR Code. However, I'm wo ...

  3. c++吃豆人代码_山药豆的功效与作用营养功效

    点击上方 蓝字 关注我们 山药豆(薯蓣科薯蓣)的叶腋间常生有肾形或卵圆形的珠芽,名"零余子"又称山药籽,俗称"山药豆.山药蛋",有食补作用.山药(薯蓣科薯蓣)的 ...

  4. h5评论直接显示代码_全套H5教程免费学,让你0基础自学制作H5页面

    当前,H5页面已成为各大品牌及新闻媒体普遍采取的表现形式,它可以通过优质的内容.新颖的创意向用户推广产品.传播信息,并利用互联网的快速性,短时间内达到很高的浏览量和识别度.相较于H5而言,海报或视频设 ...

  5. php study 直接显示代码_《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PDO ...

  6. fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE ...

  7. java页面分页显示代码_通用分页jsp页面显示

    注:本章内容都是在上一篇文章 通用分页后台显示:https://www.cnblogs.com/ly-0919/p/11058942.html  的基础上进行改进,所以有许多的类都在上一篇, 带来不便 ...

  8. Bootstrap Switch 开关控件

    Bootstrap Switch开关控件网址:http://www.bootcss.com/p/bootstrap-switch/ 引入. Bootstrap Switch插件和依赖插件,并初始化开关 ...

  9. bug之bootstrap switch Uncaught TypeError: Cannot read property 'apply' of undefined

    2019独角兽企业重金招聘Python工程师标准>>> <input type="checkbox" name="my-switch" ...

最新文章

  1. nagios监控三部曲之——为什么nagios不能发送报警邮件(2)
  2. Linux Graphic DRI 显示子系统 介绍1
  3. tomcat连接不上本地mysql_mysql连接不上tomcat
  4. CSS的子选择器与后代选择器的区别
  5. 数据库原理 知识点总结
  6. Java的新项目学成在线笔记-day14(四)
  7. python处理netcdf_在python中高效读取netcdf变量
  8. 读《代码整洁之道》前四章浅显印象 和 我所见的不整洁代码引以为戒
  9. 2-7 SpringBoot常用注解讲解
  10. 【程序设计】模块化的注意事项和不良实践
  11. 兼容IE和FF:获取Referer的JS和PHP方法 及 PHP利用curl伪造IP和来路
  12. 港股区块链板块持续上行,火币科技涨超50%
  13. 190311每日一句
  14. sql 创建存储过程
  15. WPS Office Pro v10.8.2.6726 绿色便携专业增强版
  16. 【论文翻译】Deep Learning
  17. busboy文件上传遇到的坑,已解决
  18. 田野调查手记·浮山摩崖石刻(二)
  19. Mac修改文件名的颜色
  20. Diagnosing OSGi uses conflicts

热门文章

  1. php可逆加密函数,简洁的PHP可逆加密函数
  2. jpa 原生sql 查询返回一个实体_spring data系列之jpa
  3. android viewpager 详解,详解Android App中ViewPager使用PagerAdapter的方法
  4. 二叉树构造c语言实现,递归创建二叉树c语言实现+详细解释
  5. server sql 统计信息 过时_sql-server – 何时更新统计信息?
  6. c语言学习进阶-C语言程序性能优化
  7. java提示需要标识符,java错误需要标识符
  8. 四六级考试中的计算机类文章,毕业设计论文-基于web的英语四六级模拟在线考试系统.doc...
  9. 如何对您的API进行单元测试
  10. java 复制文本内容_基于java文本复制的7种方式总结