- 博客(385)
- 收藏
- 关注
原创 Quartz 基本使用
官网:http://www.quartz-scheduler.org/Quartz 的意思是石英,像石英表一样精确。Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce sys
2025-06-11 23:37:35
642
原创 任务调度介绍
3、 查找 TaskScheduler 的实现类实例默认是通过类型查找,若有多个实现则会查找名字为"taskScheduler"的实现 Bean,若没有找到则在 ScheduledTaskRegistrar 调度任务的时候会创建一个 newSingleThreadScheduledExecutor,将TaskScheduler 的实现类实例设置到 ScheduledTaskRegistrar 属性中。2、银行业务系统,夜间要完成跑批的一系列流程,清理数据,下载文件,解析文件, 对账清算、切换结算日期等等。
2025-06-11 23:34:33
340
原创 生产故障原因和分类
观念和思想来源于:【混沌工程】一书说起混沌工程一次,也许你听过阿里的红蓝军对抗。混沌工程是一种通过实验探究的方式来让我们理解系统行为的方法,就像科学家通过实验来研究物理和社会现象一样,混沌工程通过实验来了解特定的系统 如何使用混沌工程提高系统弹性呢?混沌工程通过设计 和执行一系列实验,帮助我们发现系统中潜在的、可以导致灾难的或让我们的用户受损的脆弱环节,推动我主动解决这些环节存在的问题 和现在各大公司主流的被动式故障响应流程相比,混沌工程向前迈进了一大步。
2025-06-10 23:15:59
500
原创 生产故障分级规范概要
计算机是当今世界的命脉,你能看到的任何地方,计算机都在改变着世界,不论是传统的制造生产,医疗通讯。还是新兴的虚拟现实,无人驾驶汽车 等领域。过去的几十年,计算机硬件飞速发展,软件领域也是不断刷新着人们的想象。可以说,计算机学科复杂而且庞大,甚至有人说,不亚于物理学。今天我们讨论的话题,线上事故分析,只是其中的一部分,一小部分,为了说清楚这一点,我们简单了解一下软件工程学科。玛格丽特·希菲尔德·汉密尔顿。
2025-06-09 23:25:16
738
原创 MySQL调优
慢查询日志,顾名思义,就是查询花费大量时间的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。如何开启,我们稍后再说。有了慢查询语句后,就要对语句进行分析。
2025-06-08 23:21:55
881
原创 性能调优案例
原因很简单,就是索引的大小。分析发现,通过FORCE INDEX (idx_name_Age_Gender) 强制使用三键的联合索引索引,它的成本和两键的联合索引是一样的!这里的话(因为之前已经有一个联合索引,不过这个联合索引覆盖不了status),索引执行计划分析,会使用上述的联合索引(复合索引)要造成死锁,肯定是要多个线程(2个及以上)去抢锁,并且抢的锁至少要有2把,同时是手动事务,每个线程尝试抢相同的锁,但是顺序不同!其他的AI查询,出现一个错误的答案:索引的选择性,索引的选择度。
2025-06-08 23:16:52
988
原创 MySQL8新特性底层原理
MySQL 8.0开始真正支持降序索引 (descendingindex)。只有InnoDB存储引擎支持降序索引,只支持BTREE降序索引。另外MySQL8.0不再对GROUP BY操作进行隐式排序。在MySQL中创建一个t2表如果是5.7中,则没有显示升序还是降序信息我们插入一些数据,给大家演示下降序索引的使用看下索引使用情况我们在5.7对比一下这里说明,这里需要一个额外的排序操作,才能把刚才的索引利用上。我们把查询语句换一下MySQL8中使用了。
2025-06-07 23:35:13
938
原创 事务底层与高可用原理
在聚簇索引中,记录是按照主键值的大小连成了一个单向链表的,如果我们更新了某条记录的主键值,意味着这条记录在聚簇索引中的位置将会发生改变,比如你将记录的主键值从1更新为10000,如果还有非常多的记录的主键值分布在1 ~ 10000之间的话,那么这两条记录在聚簇索引中就有可能离得非常远,甚至中间隔了好多个页面。更新记录时,对于被更新的每个列来说,如果更新后的列和更新前的列占用的存储空间都一样大,那么就可以进行就地更新,也就是直接在原记录的基础上修改对应列的值。往这张表中插入多条记录。
2025-06-06 23:28:53
818
原创 InnoDB引擎底层解析
InnoDB的内存结构和磁盘存储结构图总结如下:其中的Insert/Change Buffer主要是用于对二级索引的写入优化,Undo空间则是undo日志一般放在系统表空间,但是通过参数配置后,也可以用独立表空间存放,所以用虚线表示。
2025-06-06 23:23:10
468
原创 MySQL的执行原理-下篇
MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。I/O成本我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。CPU成本读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位。
2025-06-06 23:20:11
979
原创 MySQL的执行原理-上篇
连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。所以我们把e1和e2两个表连接起来的过程如下图所示:这个过程看起来就是把e1表的记录和e2的记录连起来组成新的更大的记录,所以这个查询过程称之为连接查询。连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,像这样的结果集就可以称之为笛卡尔积。因为表e1中有3条记录,表e2中也有3条记录,所以这两个表连接之后的笛卡尔积就有3×3=9行记录。
2025-06-05 23:31:01
654
原创 MySQL中的系统库
MySQL有几个系统数据库,这几个数据库包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息,我们现在稍微了解一下。这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些是一些描述性信息,称之为元数据。sys。
2025-06-05 23:17:34
831
原创 flowable中的网关
图示排他网关用内部带有’X’图标的标准网关(菱形)表示,'X’图标代表异或的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中混合使用有及没有X的菱形标志。
2025-06-04 23:16:08
1390
原创 flowable中的流程变量
流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在Java服务任务(service task)中用于调用外部服务(例如为服务调用提供输入或结果存储),等等。流程实例可以持有变量(称作流程变量 process variables用户任务以及执行(executions)——流程当前活动节点的指针——也可以持有变量。
2025-06-03 21:50:27
399
原创 流程实例、执行实例、任务实例
是三个核心概念,它们分别代表流程运行的不同层次。在 Flowable(或 Activiti)流程引擎中,代表流程的具体执行路径(如并行分支、当前活动节点)。代表一次完整的流程运行(如一次请假申请)。代表需要人工处理的任务(如审批任务)。从任务创建到完成(complete)。一个流程定义可对应多个流程实例。一个流程实例可对应多个执行实例。一个执行实例可对应多个任务实例。理解这三者的区别,有助于更好地。从进入某个节点到离开该节点。代表一次完整的流程运行。管理流程的当前执行路径。代表需要人工处理的任务。
2025-06-03 21:42:00
678
原创 任务分配方式详解
*传递的参数可以是字面值(literal value),也可以是表达式,它们会被自动解析。myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法。固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过Assignee来指定的方式。我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee。先部署流程,然后在启动流程实例的时候绑定表达式对应的值。在流程变量表中我们可以看到对应的流程变量信息。,说明UEL表达式被解析了。
2025-06-02 23:58:54
348
原创 Flowable基础表结构
最后我们如果要加载自定义名称的配置文件可以通过ProcessEngineConfiguration中的对应构造方法来实现@TestBPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识,BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范,它能增进业务建模时的沟通效率。目前BPMN2.0是最新的版本,它用于在BPM上下文中进行布局和可视化的沟通。
2025-06-02 23:40:50
689
原创 Flowable流程设计器
Flowable提供了名为Flowable Eclipse Designer的Eclipse插件,可以用于图形化地建模、测试与部署BPMN 2.0流程。 去Eclipse官网下载即可:Eclipse Packaging Project (EPP) Releases | Eclipse Packages 注意2020-09后的版本不再支持jdk8 解压缩就可以了,然后进入解压缩的目录 直接启动即可 然后我们再安装下Flowable的插件,选择Help → Install New Software。在
2025-06-02 23:11:13
767
原创 MySQL体系架构
使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:表名.ibd。这个文件是所谓的自扩展文件,也就是当不够用的时候它会自己增加文件大小,当然,如果你想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的ibdata1这个文件名难听,那可以在MySQL启动时配置对应的文件路径以及它们的大小,我们也可以把系统表空间对应的文件路径不配置到数据目录下,甚至可以配置到单独的磁盘分区上。
2025-06-01 23:09:44
1163
原创 MySQL8新特性
一个staff表,里面有id,有name还有一个 m_id,这个是对应的上级id。数据如下:如果我们想查询出每一个员工的上下级关系,可以使用以下方式。
2025-06-01 22:51:53
880
原创 MySQL中的锁
IS、IX锁是表级锁,它们的提出仅仅为了在之后加表级别的S锁和X锁时可以快速判断表中的记录是否被上锁,以避免用遍历的方式来查看表中有没有上锁的记录。就是说其实IS锁和IX锁是兼容的,IX锁和IX锁是兼容的。我们画个表来看一下。
2025-05-31 23:39:40
842
原创 事务和事务的隔离级别
1、如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。2、如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
2025-05-31 23:35:54
1011
原创 Flowable中的三种网关
假如说报销金额大于 500,zhangsan 审批,报销金额大于 1000,则需要 zhangsan 和 lisi 同时审批,且 zhangsan 和 lisi 审批无先后顺序。小伙伴们看到,这是一个简化的生产笔记本的流程图,当屏幕和键盘都生产好之后,再进行组装,整个流程图中存在两个并行网关(成对出现)。在这个流程图中,连接线上是不需要设置条件的(不同于排他网关),这里即使你设置了条件,这个条件也是不会生效的。并行网关一般是成对出现的,一个出现的并行网关用来分流,第二个出现的并行网关用来聚合。
2025-05-30 23:38:38
1083
原创 三、SpringBoot整合Flowable
根据本人的理解,就是审批流程管理。官方解释如下:Flowable 项目提供了一套核心的开源业务流程引擎,这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管理 (BPM) 平台。它的核心是一个闪电般快速、久经考验的动态 BPMN 流程引擎,伴随着 DMN 决策表和 CMMN 案例管理引擎,所有这些引擎都是用 Java 编写的。它们是 Apache 2.0 许可的开放源代码,拥有一个承诺社区。
2025-05-30 23:17:49
1168
原创 二、FlowAble概述
Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例子,逐步介绍各种概念与API。Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。
2025-05-29 23:05:13
829
原创 一、工作流介绍
就是对系统的业务流程进行自动化管理,所以工作流是建立在业务流程的基础上,所以一个软件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。当然如果不合格也需要设置一个值来代表不合格的情况。2、行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
2025-05-29 23:03:19
215
原创 MySQL中的索引
能表示的整数范围当然也是依次递增,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使用INT,这是因为数据类型越小,在查询时进行的比较操作越快(CPU层次)数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
2025-05-28 23:24:16
948
原创 数据库基础知识
范式来自英文Normal Form,简称NF。实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
2025-05-27 22:43:22
983
原创 Nacos客户端服务订阅机制的核心流程
Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理(更新实例,更改本地缓存)。 以下是订阅方法的主线流程,涉及内容比较多,细节比较复杂,所以这里我们主要学习核心部分。订阅方法的调用,并进行EventListener的注册,后面UpdateTask要用来进行判断;通过委托代理类来处理订阅逻辑,此处与获取实例列表方法使用了同一个方法;
2025-05-27 22:31:15
528
原创 Nacos客户端服务发现源码分析
如果是订阅模式,则直接从本地缓存获取服务信息(ServiceInfo),然后从中获取实例列表,这是因为订阅机制会自动同步服务器实例的变化到本地。 但是如果我们要是细化这个流程,会发现不仅包括了通过NamingService获取服务列表,在获取服务列表的过程中还涉及到通信流程协议(Http or gPRC)、订阅流程、故障转移流程等。 在这里我们主要要关注getAllInstances方法,那我们就需要看一下这个方法的具体操作,当然这其中需要经过一系列的重载方法调用。 集群列表:默认为空数组。
2025-05-27 22:26:10
393
原创 Nacos服务端健康检查源码分析
在之前的1.x版本中临时实例走Distro协议内存存储,客户端向注册中心发送心跳来维持自身healthy状态,持久实例走Raft协议持久化存储,服务端定时与客户端建立tcp连接做健康检查。 但是2.0版本以后持久化实例没有什么变化,但是2.0临时实例不在使用心跳,而是通过长连接是否存活来判断实例是否健康。注册中心客户端2.0之后使用gRPC代替http,会与服务端建立长连接,但仍然保留了对旧http客户端的支持。,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。的客户端,向客户端发起。
2025-05-27 22:22:32
677
原创 Nacos客户端实例注册源码分析
然后再通过SpingBoot的自动装配(首先找到)来加载EnableAutoConfiguration对应的类,然后这里我们就能看见很多Nacos相关的内容,那我们怎么能知道这个服务在注册的时候具体走的时候哪一个,其实一般这种文件我们都会找“Auto”关键子的文件来进行查看,然后我们现在要了解的是客户端的注册,所以我们要找“NacosServiceRegistryAutoConfiguration”。然后在start()方法中调用register()方法来注册服务。
2025-05-26 23:31:18
711
原创 Nacos客户端服务注册源码分析
我们从Nacos-Client开始说起,那么说到客户端就涉及到服务注册,我们先了解一下Nacos客户端都会将什么信息传递给服务器,我们直接从Nacos Client项目的NamingTest说起其实这就是客户端注册的一个测试类,它模仿了一个真实的服务注册进Nacos的过程,包括NacosServer连接、实例的创建、实例属性的赋值、注册实例,所以在这个其中包含了服务注册的核心代码,仅从此处的代码分析,可以看出,Nacos注册服务实例时,包含了两大类信息:Nacos Server连接信息和实例信息。Na
2025-05-25 23:01:56
668
原创 Nacos核心功能与模块简介
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。那么知道了这些,现在我们就来进行Nacos的源码下载,然后我们具体分析。下载好之后我们需要启动Nacos,那么我们首先要找到nacos-console这个模块,找到启动类,同时还要配置启动模式为单机(我们还是以单机模式为演示)
2025-05-25 23:00:29
414
原创 异步编程源码解析
FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。一般是配合Callable去使用。异步任务启动之后,可以获取一个绑定当前异步任务的FutureTask。可以基于FutureTask的方法去取消任务,查看任务是否结果,以及获取任务的返回结果。FutureTask内部的整体结构中,实现了RunnableFuture的接口,这个接口又继承了Runnable, Future这个两个接口。
2025-05-24 23:30:59
647
原创 JUC并发工具源码
CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。需要一个并发安全的计数器来操作。CountDownLatch就可以实现。给CountDownLatch设置一个数值。可以设置3。每个业务处理完毕之后,执行一次countDown方法,指定的3每次在执行countDown方法时,对3进行-1。主线程可以在业务处理时,执行await,主线程会阻塞等待任务处理完毕。
2025-05-24 23:19:53
983
原创 并发集合源码
红黑树是一种特殊的平衡二叉树,首选具备了平衡二叉树的特点:左子树和右子数的高度差不会超过1,如果超过了,平衡二叉树就会基于左旋和右旋的操作,实现自平衡。每个节点必须是红色或者黑色。根节点必须是黑色。如果当前节点是红色,子节点必须是黑色所有叶子节点都是黑色。从任意节点到每个叶子节点的路径中,黑色节点的数量是相同的。当对红黑树进行增删操作时,可能会破坏平衡或者是特性,这是红黑树就需要基于左旋、右旋、变色来保证平衡和特性。
2025-05-23 23:24:54
696
原创 线程池源码
首先ThreadPoolExecutor中,一共提供了7个参数,每个参数都是非常核心的属性,在线程池去执行任务时,每个参数都有决定性的作用。但是如果直接采用JDK提供的方式去构建,可以设置的核心参数最多就两个,这样就会导致对线程池的控制粒度很粗。所以在阿里规范中也推荐自己去自定义线程池。手动的去new ThreadPoolExecutor设置他的一些核心属性。自定义构建线程池,可以细粒度的控制线程池,去管理内存的属性,并且针对一些参数的设置可能更好的在后期排查问题。
2025-05-23 23:18:31
867
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人