线上数据库链接打满问题排查

9 月 10 日
阅读 3 分钟
180
2022-11-16 19:31接到线上各系统报警(邮件+报警群),经雷达日志查看,各主要项目(userlbb、courselbb、lbb2c等)存在大量数据库链接丢包问题。

选人组件

9 月 9 日
阅读 1 分钟
84
背景乐班班系统中存在许多选择学员的场景,如课程、计划等,我们需要将上述场景抽象成统一组件。难点&解决方案一、选择方式丰富点选学员全体学员静态选择部门、学习群(当前时间点下部门、学习群的学员)动态选择部门、学习群、标签动态变静态取消选择部门、学习群、标签、学员注意:上述不同操作可能相互影响。 {代码.....

一次线上服务oom问题排查

9 月 8 日
阅读 2 分钟
143
 通过服务监控能定位问题发生的大致时间,机器,cpu和内存状态(这部分截图没保留);再通过时间范围去筛选服务日志,可能会有所收获——当然,这次除了OOM时间段RT变慢外,其它响应没发现有什么问题。 

学习时长治理方案

9 月 5 日
阅读 1 分钟
161
之前难点业务层面:1.课程小节类型多 2.涉及业务广:C端课程进度、完成情况、学习记录;B端课程、计划学习数据统计技术层面:数据更新频繁(单机150qps,8服务)重构:1.LearnDurationConsumer(写缓存)业务层面:1.从使用频率低的文章小节入手;2.特殊场景处理:观看跨小时问题,课程完成判定等技术层面:LinkedHashMa...

So框架说明

9 月 5 日
阅读 11 分钟
165
我们新增⼀张数据库表(如:questionnaire_answer)时,如果作为服务端(如:courselbb-platform项⽬),⼀般需要创建如下对象:

kafka(下):快、主从同步

2022-03-14
阅读 2 分钟
1.9k
补充:写消息还有一点优化,生产者向broker发送消息过程会先向Page Cache里写入,再异步刷盘到log文件。为防止消息丢失,可以采用replication备份的方式。
封面图

kafka(上):基本结构和消息存储

2022-03-11
阅读 3 分钟
1.4k
2.8版本前,kafka需要zk存储broker和consumer部分信息(注意:producer不依赖zk);2.8之后,kafka已经不再依赖kafka。
封面图

rabbitmq(下):消息可靠性

2022-03-09
阅读 2 分钟
1.1k
其实这个问题适用于任何mq,虽然不同的mq具体操作上有区别,但大体上需要从三个方面考虑:生产者发送、broker存储和消费者接收均保证消息可靠。
封面图

rabbitmq(中):死信队列和延时队列

2022-03-08
阅读 1 分钟
1.1k
死信队列ttlttl(time to live),消息存活时间RabbitMQ支持两种ttl设置:整个队列进行配置ttl,所有被投递到该队列的消息都最多不会存活超过N单独消息进行配置ttl如果同时配置了队列的TTL和消息的TTL,那么较小的那个值将会被使用。死信消息以下3种情况消息出现死信:消费者拒收消息(basic.reject/ basic.nack) ,并...
封面图

rabbitmq(上):基本结构和高可用

2022-03-06
阅读 2 分钟
1.2k
rabbitmq由Erlang语言编写,实现了AMQP协议,是一款易用性、扩展性、高可用的分布式mq。一、基本结构这张图揭示了rabbitmq的基本结构,解释几个概念brokerrabbit服务实例vhost虚拟主机每个 vhost 本质上就是一个 mini RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制channel信道生产者、消费者和broker建立连...
封面图

透过PageHelper看Mybatis插件机制

2022-03-03
阅读 6 分钟
1.5k
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
封面图

mybatis和springboot整合

2022-03-02
阅读 8 分钟
1.9k
SqlSessionFactory创建前,尝试读取mybatis前缀的配置文件(如mybatis-spring.xml),记录到SqlSessionFactoryBean#configLocation;如果未读取到配置文件,直接采用默认配置创建configuration
封面图

mybatis框架(下):一、二级缓存

2022-03-01
阅读 10 分钟
1.4k
一、二级缓存均指向org.apache.ibatis.cache.impl.PerpetualCache#cache,本质是一个HashMap
封面图

mybatis框架(上):主流程分析

2022-02-28
阅读 9 分钟
928
1.读取mybatis-config.xml并解析,将全部配置信息和各种默认配置加载到Configuration中,包含:数据源信息(分装在Environment)、类型处理器、类型别名、mapper代理工厂等。Configuration是SqlSessionFactory的重要属性。2.通过SqlSessionFactory创建transaction、executor、sqlSession。3.通过sqlSession获取mapper,...
封面图

spring aop 分析

2022-02-25
阅读 9 分钟
1.2k
一、生成代理对象spring对象初始化过程(忘记了可以看这里:对象初始化常规流程),属性赋值后对对象做代理增强——这是AOP得以实现的基础。源码入口如下: {代码...} 我们看下方法实现: {代码...} 跟踪后置处理器的执行链路: {代码...} 分别观察这两步的实现。1.获取Advisor {代码...} 从这部分源码又衍生出几个问题。A...
封面图

spring ioc(下):循环依赖、三级缓存和FactoryBean

2022-02-24
阅读 5 分钟
1.6k
上一篇文章,整体介绍了spring ioc容器初始化过程(starter->refresh->registerBeanDefinition->doCreateBean->populateBean)
封面图

spring ioc(上):对象初始化

2022-02-20
阅读 6 分钟
1.3k
spring对象管理绕不开IOC,那什么是IOC?IOC是一种思想——让业务对象A、B解耦,对象创建过程交由Spring维护;而这种思想的实现靠DI完成这里给出两个概念的详细解释(个人理解)IOC控制反转举例,A依赖B——B是A的必要属性过去:当运行到某功能时,如果B is null,A必须创建B或为其赋值才能保证功能的正常运行。即,控制权在...
封面图

springboot自动装配

2022-02-19
阅读 5 分钟
3.9k
springboot与spring相比,有一个优势就是大部分配置都有一套默认设定,不必再写大量的配置文件,即“约定优于配置”。而这是靠自动装配实现的。
封面图

【JUC】ConcurrentHashMap原理分析(下)

2022-02-08
阅读 11 分钟
1.1k
首先tab的size始终是2的n次幂,转换成二进制就是100..00的形式而落点桶的计算公式为:plot = (n-1)&hash -> 11..11&hash
封面图

【JUC】ConcurrentHashMap原理分析(上)

2022-02-08
阅读 6 分钟
1.2k
一、新方法java 1.8之后,HashMap提供了一些新方法,方便了某些特定场景的操作compute {代码...} 使用举例: {代码...} merge {代码...} 二、实现原理1.初始化table数组我们从put方法入手进行分析。首先会进入初始化table数组逻辑 {代码...} {代码...} 2.普通put通过spread()方法计算出的hash必定是正数hash为负数有特殊...
封面图

【JUC】可回调任务FutureTask原理

2022-02-04
阅读 5 分钟
1.6k
线程A执行start方法时,会调用FutureTask的run()方法(Runnable接口)run()方法会触发FutureTask内部的state状态变更,并调用Callable的call()方法
封面图

程序员的自我修养

2022-02-03
阅读 1 分钟
1.4k
源码说明A. 源码加了很多中文注释,重要部分会以==、--、##、$$等符号标记B. 源码只保留了关键部分,来解释当前章节要阐述的内容,避免干扰
封面图

【JUC】线程池ThreadPoolExecutor

2022-02-02
阅读 8 分钟
1.1k
样例及原理 {代码...} execute原理线程池工作流程工作线程数 < 核心线程数,创建线程线程一直处于while循环中(不被释放),首次直接执行任务,之后以take方式获取阻塞队列任务工作线程数 >= 核心线程数,offer方式将任务加入阻塞队列offer成功:什么都不用做,等待队列任务被消费即可offer失败:创建最大线程;最...
封面图

多线程工具ThreadLocal

2022-01-31
阅读 8 分钟
997
ThreadLocalMap解决hash冲突的方式与HashMap的方式不同(链、树),ThreadLocalMap它会从落点桶位置顺序查找。如:hash取余计算出落点桶是5,但位置5已经有其它entry,那么会尝试放入桶6……
封面图

【JUC】ArrayBlockingQueue之Condition应用

2022-01-29
阅读 3 分钟
1k
创建ArrayBlockingQueue时会构建一个数组,用来存放元素;同时会创建一个notEmpty的condition条件。①、生产者生产元素元素A会存放在数组中,同时会触发notEmpty这个condition的signal方法唤醒被阻塞的消费者。②、消费者消费元素此时另一个线程消费,本着FIFO原则元素A会被移除出数组,当数组元素的length=0时,触发await...
封面图

【JUC】CountDownLatch共享节点队列

2022-01-29
阅读 6 分钟
921
结构如图,与AQS家族的ReentrantLock对比,最大的差别在于——CountDownLatch是共享模式,ReentrantLock是独占模式
封面图

【JUC】两张图掌握Condition的等待、唤醒逻辑

2022-01-28
阅读 6 分钟
1.1k
使用样例 {代码...} 1、图解await条件:await()在lock()和unlock()之间执行——执行await的方法必定持有锁(owner记录的线程)步骤A:await执行时会做三件事:1.清除state和owner 2.唤醒工作队列的head.next 3.加入并阻塞在等待队列中步骤B:head.next节点绑定的线程(图中为ThreadB)被唤醒,试图抢占锁。抢占成功从工作...
封面图

【JUC】一图看懂ReentrantLock加、解锁逻辑

2022-01-26
阅读 7 分钟
1.2k
使用样例 {代码...} 非公平加锁过程公平方式,无ThreadD部分逻辑,会直接入队后续都在详细解释这张图一、非公平加锁1.状态修改 {代码...} 2.队列构建 {代码...} a-尝试获取(可能插队的位置) {代码...} b1-新增等待节点,构建“独占”模式队列 {代码...} {代码...} b2-排队获取 {代码...} 二、释放 {代码...} 1.state还原...
封面图

mysql分页查询踩坑报告

2020-01-05
阅读 2 分钟
1.8k
分页查询大家经常用到,如果各位大侠有幸参与后台管理系统第开发,对此更是轻车熟路。不管你用怎样的分页控件,一般来说,最终会回归到mysql层面,最终通过limit去分页。

记一次AOP问题排查

2019-09-20
阅读 4 分钟
1.7k
情况是这样的:由于某业务上的需求,需要数据库表T的数据发生变化时,通知给其它系统。改造前,在各数据发生变化的业务节点,直接调用通知方法,将数据同步给其它系统;改造后,使用了spring aop,基于抽象出的update方法,进行数据同步。