记一次因为共享缓存导致流水号重复的问题排查过程-程序员宅基地

技术标签: 项目经历  缓存  

背景:

        在开发日终应用或者跑批应用的时候,进行每天凌晨跑批或者全天跑批多次进行表数据清理的时候,每次清理都会登记操作明细到日志表,流水号是根据Oracle号段模式获取1000个流水号段放内存里,不够用再从数据库重新获取一批。跑批应用是连接了多个数据源的(TDSQL 9个分库),任务调度平台每次到了启动时间就会部署实例,然后再销毁实例。

问题来了:写操作日志的时候,有些分库的error日志会报insert唯一键冲突,但是这个获取流水号的方法是每个分库都独立的,从Oracle的递增序列不断增加的,每个分库获取的一批流水号然后再插入每个分库的日志表理论上是不会重复的,那为什么会出现这样的情况呢?而且这个DuplicateKeyException还是偶发的,并不是每次跑批的时候都会出现,有些时间点执行的时候没有报错,有时候报错。有时候01分库报错,有时候02分库报错.....非常奇怪

排查思路:

1、初步怀疑是平台部署实例的时候没有销毁掉,而是复用了上一次部署的内存,比如:10:00部署执行完之后没销毁继续运行等到17:00再重新调度起来,导致内存里还残留上次缓存的流水号没用完继续用。加上日志每次启动前都打印一下实例号,发现每次的实例都是不一样的,并不是复用旧的,而且经咨询发现平台的机制是会销毁重新部署的。

2、可能是获取流水号的方法逻辑有问题,排查了一遍代码没发现异常,每个分库申请的流水号都是独立的互不影响的,而且这套流水号方法其他应用使用了很多年没出现过问题;

3、查看日志平台,怀疑是分库的日志显示错乱了,01分库出现的报错日志显示到了02分库上,导致毫无规律可言,经排查任务调度平台会默认设置01分库为主数据源,导致统一日志平台只会显示一个数据库的日志,实际上这个数据库的tag标签是不准的包含了其他分库的日志。

4、插入数据库的记录按照时间戳排序,流水号居然不是递增的。在代码加日志在insert前打印时间,发现数据库时间和应用上的机器时间也是吻合的,理应时间戳和流水号是递增才对,为什么流水号和时间戳不是按照同一顺序排序的呢?

5、比较冲突的流水号以及日志表的流水号规律,发现不是连续的,比如:01分库上午使用了1,2,3;然后02分库的流水号理论上应该也是从1,2,3开始的,但是事实上却不是如此,而是从4,5,6开始;下午执行的时候,02分库应该是从上午的1,2,3开始递增使用4,5,6才对,但是居然又使用了1,2,3,导致了冲突

结合任务调度平台多数据源任务的处理机制终于找到原因:到了执行时间批量应用执行部署都共享一块内存空间,执行完全部分库任务才会销毁这份内存资源。流水号是先申请一批(100个0)存放内存,每次获取流水号都先从缓存取,不够再从数据库拿一批。多数据源是并行执行的,哪个分库先执行就会先申请流水号放到缓存中,下一个分库看到缓存中有了就不再申请了,直接使用了。

为了避免这一问题不再使用jar生成流水号的方法了,而是改用UUID生成日志唯一键,问题得到了解决。

​结论:

在开发日终应用或者跑批应用的时候要特别注意,对于分库任务来说,是会共享实例内存的,因此一定要注意内存或缓存使用的场景,很有可能处理异常。以调框架里ISequenceService.getSequence来生成流水号举例:

1)第一次跑批:09分库的任务先发现缓存流水号为空,就会从09分库申请一段流水(1-1000),并放到缓存中使用,若此时97分库的任务也需要使用流水号,发现缓存中有流水号了,就直接使用缓存中的流水号并且同步到数据库,并没有从97分库申请流水。

​2)第二次跑批:假如这次跑批是97分库先执行,97分库的任务先发现缓存流水号为空,就会从97分库申请一段流水(1-1000),并放到缓存中使用,注意本次使用的流水在第一次跑批中已经使用过,如果作为唯一键插入分库中,就会出现唯一键冲突。

​启示:

跑批或日终应用,一定不能使用内存或缓存进行分库级别的处理,否则会分库任务间的处理会互相干扰,因为单次跑批,所有分库任务都是共享实例内存的!尤其注意交易业务获取交易流水号的时候影响甚大!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/QGhurt/article/details/136611636

智能推荐

【计算机网络安全技术】Day07-静态路由配置及实例_计算机网络技术静态路由-程序员宅基地

文章浏览阅读593次。如果路由器可以以相同的路由协议学习到某个目标网段,优先级相同,路由器会选择 度量值最优的路由,添加到路由表当中。可以配置多个静态路由,并且这些静态路由的优先级是相同的,这些路由就叫做等级负载分担路由。对于描述相同的目标网段的路由,路由器在转发数据的时候,会选择子网掩码更长的路由条目,子网掩码更长,则表示描述的网段信息更精细。但是等价负责分担路由,会出现来回路径不一致的情况,如果是防火墙的场景,来回路径不一致会导致链路不通。配置路由:看路由器有没有去往目标网段的路由,在默认情况下,非直连路由是需要配置的。_计算机网络技术静态路由

主流开发语言和开发环境介绍-程序员宅基地

文章浏览阅读4.8k次,点赞6次,收藏10次。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,速度要求非常高,就可以用C++重写。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用。《魔兽世界》等几乎所有的网络游戏,百度搜索引擎,我们所用的大多数软件都是用C++写的(硬件也有很多用到C++的)。

[51单片机]学电开发板-一块值得拥有的学习利器_51开发板初学版能用电池供电吗-程序员宅基地

文章浏览阅读152次。前两天从我兄弟那里得到了一款穿了“衣服”的51开发板,说真的,能把开发板做成这样,真的是很用心,很细心。今天,借此契机,把之前想做而没做完的事情做好吧,在论坛和公众号一起为大家分享关于51单片机的开发经验与心得,虽然没有大佬们做的那么细致,但是我也有一些自己在开发中遇到的问题,BUG或者研发中的启发,都可以与大家分享,因为,研发就是互相学习,互相进步的一个过程,在这个圈子里,不仅有制作出来产品的成就,还有和大佬们畅谈和学习的快乐,好了,言归正传吧,开启我们的基于学电开发板的51单片机开发之旅。_51开发板初学版能用电池供电吗

Caused by: org.postgresql.util.PSQLException: 错误: 语法错误 在 “order“ 或附近的 位置:345_idea 报org.postgresql.util.psqlexception: :-程序员宅基地

文章浏览阅读2k次。此错误一般是由于postgres的数据库表字段名定义与关键字重名导致的错误;Missing the data source name: ‘null‘_idea 报org.postgresql.util.psqlexception: :

2021年有哪些能用的活体人物虚拟主播_免费虚拟角色男性主持人主播-程序员宅基地

文章浏览阅读1.6k次。新的一年刚刚开始,小编花费几天时间体验一把当前最前沿国内科技公司开发的虚拟人物产品。 还是先介绍一下什么是虚拟主播: 主播是一个比较抽象的概念,实际上可以理解成一个人物形象,它可以实现基本活人动作:眨眼摇头点头张口说话等。它不一定非要是在电视或者直播间的主持人。当前看来主要有卡通人物或者真实人物形象。而用途就比较广泛。例如:银行业务介绍工作人员,教育行业虚拟老师,电视媒体主持人,智能汽车虚拟助手,公共出行介绍导游,数字城市和智慧社区指引者。他们这些岗位中有一些是比较枯燥,内容单一而具有专业性,是完全可以由当_免费虚拟角色男性主持人主播

深度学习计算框架综述(十三)HVX 计算优化实践—Hexagon DSP简介_网络模型推理hvx cdsp-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏15次。本节,我们主要介绍一下HexagonDSP的架构:_网络模型推理hvx cdsp

随便推点

09线性相关、基、维数_基矩阵线性相关还是无关-程序员宅基地

文章浏览阅读407次。线性相关判断、基的计算、维数的理解_基矩阵线性相关还是无关

Linux:No space left on device_cannot remove '/tmp/.x11-unix': no space left on d-程序员宅基地

文章浏览阅读1.2k次。http://blog.csdn.net/u011957758/article/details/53750419配置服务器发现vim文件的时候,竟然失败了,报了这个错误:No space left on device,故帮忙解决了一下。顺便记录一下。出现这个错误第一反应是空间满了。df -h 一看却发现还有挺多没有用 df -i 一看发现是inodes空间满了_cannot remove '/tmp/.x11-unix': no space left on device

ZooKeeper之Web管理工具Shepher介绍-程序员宅基地

文章浏览阅读3.5k次。 ZooKeeper之Web管理工具Shepher介绍 Shepher是ZooKeeper的管理工具。在小米,我们将它用作配置管理中心。 特征ZooKeeper节点的可视化操作 ZooKeeper节点的快照管理 修改了ZooKeeper节点的Diff和Review功能 ZooKeeper节点的邮件操作通知 CAS和LDAP集成 权限管理,参考权限管理指令 类似产..._shepher

框架学习方法_对比自我监督学习和设计新方法的框架-程序员宅基地

文章浏览阅读646次。框架学习方法This is the partner blog matching our new paper: A Framework For Contrastive Self-Supervised Learning And Designing A New Approach (by William Falcon and Kyunghyun Cho). 这是与我们的新文章相匹配的合作伙伴博客: “自我..._数据增强管道是什么

Apache Kudu技术实践V1.0_header v4 dsa/sha1 signature, key id e8f86acd: nok-程序员宅基地

文章浏览阅读372次。Apache Kudu技术实践_header v4 dsa/sha1 signature, key id e8f86acd: nokey

zoom插件实现图片放大缩小功能_smartzoom 设置最小缩放倍数-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏6次。不多说,上代码js代码 $(document).ready(function() { var imgv = $('') $('#imgContainer').append(imgv); $('#imageFullScreen').smartZoom({'containerClass':'zoomableContainer'});_smartzoom 设置最小缩放倍数