记一次因为共享缓存导致流水号重复的问题排查过程

背景:

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

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

排查思路:

1、初步怀疑是平台部署实例的时候没有销毁掉,而是复用了上一次部署的内存,导致内存里还残留上次缓存的流水号没用完继续用,经咨询发现平台的机制是会销毁重新部署的

2、可能是获取流水号的方法逻辑有问题,排查了一遍代码没发现异常,而且这套流水号方法很多应用使用了很多年没出现过问题;

3、查看日志平台,怀疑是分库的日志显示错乱了,01分库出现的报错日志显示到了02分库上,导致毫无规律可言,经咨询相关平台的同事排除这一可能了

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

结合任务调度平台多数据源任务的处理机制:每次部署都共享一块内存空间,执行完全部分库任务才会销毁这份内存资源,还有流水号申请一批存放内存的逻辑找到问题归因所在:

​结论:

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

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

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

​启示:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BetterDisplay for mac V2.2.5 强大的mac显示器管理开源工具

BetterDisplay是Mac OS 一个很棒的工具! 它允许您将显示器转换为完全可扩展的屏幕 管理显示器配置覆盖 允许亮度和颜色控制 提供 XDR/HDR 亮度升级(Apple Silicon 和 Intel Mac 上兼容的 XDR 或 HDR 显示器的额外亮度超过 100% - 多种方法可用&#x…

cas_ssl

第一步 生成证书: keytool -genkey -alias castest -keyalg RSA -keystore e:/mykey/testkey 使用java的keytool命令行生成证书 -alias 密钥的别名 -keyalg 密钥使用的加密算法,此处使用RSA -keystore 密钥存储的位置,默认是存在用户主目…

CSS 居中对齐 (水平居中 )

水平居中 1.文本居中对齐 内联元素&#xff08;给容器添加样式&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

python单例模式应用之pymongo连接

文章目录 单例模式介绍模块简介安装简单的连接使用单例模式的连接单例类的实现配置的使用单例模式的测试 单例连接的调用 https://gitee.com/allen-huang/python 单例模式介绍 适用场景&#xff1a; 单例模式只允许创建一个对象&#xff0c;因此节省内存&#xff0c;加快对象访…

Gradient Boosting详解

Gradient Boosting是一种集成学习方法&#xff0c;通过迭代地训练弱分类器来构建一个强分类器。与AdaBoost类似&#xff0c;Gradient Boosting也关注之前轮次中被错误分类的样本&#xff0c;但是它的思想更加一般化&#xff0c;可以用于回归问题和分类问题。以下是Gradient Boo…

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体&#xff08;subject&#xff09;目标&#xff08;object&#xff09;策略&#xff08;policy&#xff09;&#xff08;多个规则的集合&#xff09;安全上下文&#xff08;security context&#xff09; 文…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

每日一练:LeeCode-35、搜索插入位置【数组】、面试题 01.08. 零矩阵【数组】、面试题 01.07. 旋转矩阵【数组+行列翻转】

搜索插入位置、零矩阵、旋转矩阵 每日一练&#xff1a;LeeCode-35、搜索插入位置【数组】方法一&#xff08;自己写的&#xff09;方法二二分法 每日一练&#xff1a;面试题 01.08. 零矩阵【数组】每日一练&#xff1a;面试题 01.07. 旋转矩阵【数组行列翻转】 每日一练&#x…

课时60:流程控制_if条件控制_if 案例实践

2.2.2 if 案例实践 学习目标 这一节&#xff0c;我们从 服务管理、堡垒机登录、小结 三个方面来学习。 服务管理 案例需求 要求脚本执行需要有参数&#xff0c;通过传入参数来实现不同的功能。参数和功能详情如下&#xff1a;参数 执行效果start 服务启动中...sto…

iperf流量分析

iperf3打流软件 本身不支持多线程打流&#xff0c;所以本身服务器软中断占用较高&#xff0c;无法突破打流瓶颈&#xff0c;而iperf2版本没有该问题&#xff0c;所以可以使用iperf2来进行打流&#xff0c;来呈现真实网络带宽。iperf3需要使用-P多线程 tcp传输带宽&#xff1a;…

【个人开发】llama2部署实践(三)——python部署llama服务(基于GPU加速)

1.python环境准备 注&#xff1a;llama-cpp-python安装一定要带上前面的参数安装&#xff0c;如果仅用pip install装&#xff0c;启动服务时并没将模型加载到GPU里面。 # CMAKE_ARGS"-DLLAMA_METALon" FORCE_CMAKE1 pip install llama-cpp-python CMAKE_ARGS"…

探寻程序员职业之迷:选择你的职业赛道

作为一名程序员&#xff0c;你站在职业发展的十字路口&#xff0c;眼前是一个庞大而复杂的迷宫&#xff0c;每条通道都通往不同的职业赛道。前端如花园般绚丽&#xff0c;后端似黑暗洞穴&#xff0c;数据科学则隐藏着神秘的密室。在这充满挑战和机遇的迷宫中&#xff0c;你准备…

解决eclipse上启动不了tomcat问题

一、问题&#xff1a;在eclipse上启动不了tomcat 网上搜的方法基本都不行&#xff0c;改Maven配置和重建项目等等都解决不了。问题如下 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component …

【实验报告】C语言实现猜单词的小游戏

之前帮别人写的一个简单的报告&#xff0c;无偿分享给大家~代码在后面&#xff0c;有一些图片出于懒惰没有上传。比较简单&#xff0c;喜欢的话关注我~&#xff0c;请勿商用~ 1 系统功能模块结构图 该程序主要思路&#xff1a; 头文件设计&#xff0c;存储结构设计&#xff0…

Ubuntu启用ROOT用户和配置SSH远程

文章目录 Ubuntu启用ROOT用户和配置SSH远程一、前言1.简介2.环境 二、正文1.首次启用ROOT用户2.配置ROOT的SSH远程 Ubuntu启用ROOT用户和配置SSH远程 一、前言 1.简介 在Ubuntu系统中&#xff0c;默认情况下&#xff0c;root用户&#xff08;也就是超级用户或管理员用户&…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

IOS面试题object-c 71-80

71. 简单介绍下NSURLConnection类及 + sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?NSURLConnection 主要用于网络访问,其中 + sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待…

UE4开个头-简易小汽车

跟着谌嘉诚学的小Demo&#xff0c;记录一下 主要涉及到小白人上下车和镜头切换操作 1、动态演示效果 2、静态展示图片 3、蓝图-上下车

机器人大赛有什么用?

机器人大赛在多个方面都具有显著的价值。首先&#xff0c;机器人大赛可以为学生提供一个实践与创新的机会&#xff0c;有助于培养学生的动手实践能力和创新思维。在比赛过程中&#xff0c;学生需要运用所学的知识和技能&#xff0c;设计、制作和调试机器人&#xff0c;这不仅可…

云原生技术实践:Kubernetes集群的部署与运维

随着云原生技术的兴起&#xff0c;Kubernetes作为容器编排领域的领导者&#xff0c;受到了越来越多开发者和运维人员的关注。本文将深入探讨Kubernetes集群的部署与运维实践&#xff0c;旨在为中高级技术人员提供有价值的参考和帮助。 一、引言 云原生技术作为现代软件开发的…