摘要: 原理 令牌桶(Token Bucket)限流算法,系统会以一个恒定的速度往桶里放入令牌,请求在处理前需要先从桶里获取一个令牌。如果桶里没有令牌可取,则拒绝服务。 代码实现 热点参数限流是基于令牌桶算法实现的。 这个模式的难点在于,如何一边往令牌桶投放令牌,一边获取令牌。一般会想到使用两个线程,但Se 阅读全文
posted @ 2023-10-22 09:12 kingsleylam 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 1. 滑动窗口 原理 滑动窗口限流算法(Sliding Window)是对固定窗口算法的一个改进。在滑动窗口算法中,窗口大小仍然是固定的,但它把单位时间周期划分为n个小周期,分别记录每个小周期内请求的数量,根据时间滑动删除过期的小周期。 需要注意的是,当请求到达新的周期,才会往前滑动,也就是说滑动是 阅读全文
posted @ 2023-10-04 17:54 kingsleylam 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 本文基于Sentinel 1.8.6版本分析 1. SlotChain 我们从入口com.alibaba.csp.sentinel.SphU#entry(java.lang.String) 开始分析。 一路走读下来,会进入到这个方法com.alibaba.csp.sentinel.CtSph#loo 阅读全文
posted @ 2023-10-04 17:30 kingsleylam 阅读(218) 评论(0) 推荐(1) 编辑
摘要: 关于Sentinel的介绍网上很多,不再复制粘贴。 本文主要演示Sentinel的两个重点功能:流量控制和熔断降级。 示例基于Sentinel 1.8.6, 同时使用JMeter进行并发请求(Postman无法并发)。当然也可以通过main方法,但这样就无法重复触发,并且无法学习Sentinel与S 阅读全文
posted @ 2023-10-02 12:39 kingsleylam 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 1.简介 1.1 gRPC的起源 RPC是Remote Procedure Call的简称,中文叫远程过程调用。用于解决分布式系统中服务之间的调用问题。通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。所以,RPC的作用主要体现在这两个方面: 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用 阅读全文
posted @ 2023-01-27 20:49 kingsleylam 阅读(4534) 评论(1) 推荐(1) 编辑
摘要: 1.问题背景 最近项目中遇到一个场景。 为了减少单库的数据量,系统采用了分库的方式,分为1个主库和N个分库。 现在,在分库中的A表,需要收敛成一个汇总的数据,并写入主库中的B表。需要保证分库更改A表的处理状态和插入主库B表两个动作具有原子性,那么,这就涉及到了跨库的分布式事务的一致性问题。 经过一番 阅读全文
posted @ 2022-02-20 14:48 kingsleylam 阅读(520) 评论(0) 推荐(1) 编辑
摘要: 最近在工作中使用Spring的事务踩过一些坑,抽象成一些场景,记录一下。 首先创建测试表,用于后续的演示。同时约定process_flag枚举值,0表示未处理,1表示已处理。 1 CREATE TABLE test_record ( 2 id VARCHAR (16) PRIMARY KEY, 3 阅读全文
posted @ 2022-01-06 00:26 kingsleylam 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 最近有同事在项目上遇到一个场景,定时任务在往MySql插入一条数据超时了,而排查其他SQL,没有锁表的动作。排查到最后,发现是分区表导致id不唯一,加上Gap锁导致的。下面简单分析一下。 1.场景重现 1.1 没有分区的场景 先建一个没有分区的表 1 CREATE TABLE student ( 2 阅读全文
posted @ 2020-07-19 22:50 kingsleylam 阅读(549) 评论(0) 推荐(0) 编辑
摘要: 什么是适配器模式 网上已有很多的教程,不细讲了。可以参考:[五分钟了解设计模式(3) 适配器模式]( https://www.cnblogs.com/kubidemanong/p/9609856.html) 在适配器模式中,一定要识别清楚,Target Adaptee Adapter分别是哪些类或接 阅读全文
posted @ 2019-11-02 23:33 kingsleylam 阅读(708) 评论(0) 推荐(0) 编辑
摘要: 什么是真实执行计划 获取Oracle的执行计划,有几种方式。(本文使用Oracle 11g XE版本,以及普通用户scott登录) explain plan for 有两个步骤: explain plan for ${SQL} select from table(dbms_xplan.display 阅读全文
posted @ 2019-10-02 18:04 kingsleylam 阅读(6749) 评论(0) 推荐(2) 编辑
摘要: 1. 什么是FactoryBean FactoryBean本质上是一种Bean,只是它可以产生其他的Bean,比较特殊。在上下文getBean的时候,如果传入FactoryBean的名称,得到的是FactoryBean生产的产品,而不是FactoryBean。如果要获得FactoryBean自身,那 阅读全文
posted @ 2019-08-03 09:38 kingsleylam 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 1. 什么是BeanPostProcessorBeanPostProcessor是一个接口,有两个方法,分别是:Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException 和 Objec 阅读全文
posted @ 2019-08-02 23:46 kingsleylam 阅读(506) 评论(0) 推荐(0) 编辑
摘要: 最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了。 不过,我倒是对线程池是如何回收工作线程比较感兴趣,所以简单分析了一下,加深对线程池的理解吧。 那么,就以JDK1.8为例分析吧。 1 阅读全文
posted @ 2019-07-25 11:34 kingsleylam 阅读(8745) 评论(1) 推荐(4) 编辑
摘要: 1. 问题 最近有同事问了我一个问题,在Java编程中,当有一条线程要获取ReentrantReadWriteLock的读锁,此时已经有其他线程获得了读锁,AQS队列里也有线程在等待写锁。由于读锁是共享锁,当前线程是马上获得读锁,还是排队?如果是马上获得读锁,那岂不是阻塞的等待写锁的线程有可能一直( 阅读全文
posted @ 2019-07-24 00:38 kingsleylam 阅读(1111) 评论(0) 推荐(1) 编辑
摘要: 最近看到一句话:内部锁synchronized不会造成锁泄漏(Lock Leak)。 锁泄漏是指一个线程获得某个锁以后,由于程序的错误、缺陷致使该锁一直没法被释放而导致其他线程一直无法获得该锁的现象。(摘自《Java多线程编程实战指南(核心篇)》--黄文海) 很好奇JVM是怎么保证的。 我想,Jav 阅读全文
posted @ 2019-06-05 22:28 kingsleylam 阅读(670) 评论(0) 推荐(0) 编辑
摘要: 最近复习JVM的知识,对于静态分派和动态分派的理解有点混乱,于是自己尝试写写代码,在分析中巩固知识。 有如下一段代码,请问每一段分别输出什么? 下面我简单地介绍一下从代码编译到方法调用的整个过程。 · 编译 先看看第1段输出,child.foo()是调用父类还是子类的静态方法呢? 在编译阶段,发生了 阅读全文
posted @ 2019-02-17 22:53 kingsleylam 阅读(1230) 评论(0) 推荐(1) 编辑
摘要: 多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过《JavaScript高级程序设计(第2版)》。里面有一个问题(P147),让我一直百思不得其解。 表面上看,最终会输出各个元素对应的索引,依次输出0,1,2……9。但实际上却是输出10个10 1. 词法作用域 简单地说,词法作用域就是定义在词法 阅读全文
posted @ 2018-09-22 23:52 kingsleylam 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 贴代码啦 按照代码的注释操作,控制台的输出如下,观察WaitThread的变化。 testWait(): testTimedWait(): 阅读全文
posted @ 2018-04-05 18:09 kingsleylam 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 1. 双重校验锁实现单例的问题 在延迟实现单例时,一般代码形式如下: 看起来很简单,但这里有个容易忽略的点,就是instance变量,需要用volatile修饰。 为什么?如果不加的话会有什么问题呢? 让我们把目光聚焦到第11行,初始化instance变量。这一行代码可以分解为如下3行伪代码。 上面 阅读全文
posted @ 2018-04-05 17:35 kingsleylam 阅读(1297) 评论(0) 推荐(0) 编辑
摘要: 1. 动态分派 一个体现是重写(override)。下面的代码,运行结果很明显。 最终输出sub : f(); 那么虚拟机是怎么做到动态分派的呢? 不同的虚拟机有不同的实现,最常用的是使用虚方法表(Virtual Method Table) 2. 虚方法表 对于Super和Sub类,虚方法表大致如下 阅读全文
posted @ 2017-04-30 18:06 kingsleylam 阅读(1424) 评论(0) 推荐(1) 编辑