kafka(下):快、主从同步

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

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

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

rabbitmq(下):消息可靠性

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

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

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

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

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

透过PageHelper看Mybatis插件机制

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

mybatis和springboot整合

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

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

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

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

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

spring aop 分析

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

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

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

spring ioc(上):对象初始化

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

springboot自动装配

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

【JUC】ConcurrentHashMap原理分析(下)

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

【JUC】ConcurrentHashMap原理分析(上)

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

【JUC】可回调任务FutureTask原理

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

程序员的自我修养

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

【JUC】线程池ThreadPoolExecutor

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

多线程工具ThreadLocal

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

【JUC】ArrayBlockingQueue之Condition应用

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

【JUC】CountDownLatch共享节点队列

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

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

2022-01-28
阅读 6 分钟
980
使用样例 {代码...} 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.1k
使用样例 {代码...} 非公平加锁过程公平方式,无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方法,进行数据同步。

程序员楼下闲聊:某次jvm崩溃排查

2019-09-09
阅读 9 分钟
7.2k
据我理解,那个定时任务,会从hive里拿出超多的数据(据说2亿左右),按具体业务做数据整合和处理,最终推送到es(elasticsearch)中。(hive什么的我没搞过,但不妨碍要讨论的东西)

AQS系列二:源码分析“公平”ReentrantLock和Condition

2019-09-04
阅读 9 分钟
2.7k
上篇文章 AQS系列一:源码分析非公平ReentrantLock 中,我们分析了ReentrantLock的非公平实现,本篇会承接上文,继续分析ReentrantLock的公平锁实现(以及Condition的实现)。

AQS系列一:源码分析非公平ReentrantLock

2019-09-02
阅读 10 分钟
2.2k
早些时候(jdk 1.5之前),并发环境下做同步控制,你的选择不多,多半是使用synchronized关键字。不管是同步方法还是同步块,总之遇到这个关键字,未获取锁线程就会乖乖等候,直到已获取锁的线程释放掉锁。

怎么获取Thread返回值?(FutureTask解读)

2019-08-29
阅读 13 分钟
5.1k
可是,身处jdk1.4(甚至更早)的前辈们,要怎么做才能拿到线程返回值呢?或者说,禁用Callable技能,怎么获取线程返回值?嗯,这似乎是线程间通信的问题;只有Runnable作为武器,有些麻烦,接受挑战!

单例终极分析(一)

2019-06-21
阅读 6 分钟
2.3k
如果你看过设计模式,肯定会知道单例模式,实际上这是我能默写出代码的第一个设计模式,虽然很长一段时间我并不清楚单例具体是做什么用的。这里简单提一下单例的用处。作为java程序员,你应该知道spring框架,而其中最核心的IOC,在默认情况下注入的Bean就是单例的。有什么好处?那些Service、Dao等只创建一次,不必每次...