冷饭新炒:理解断路器CircuitBreaker的原理与实现
前提笔者之前在查找Sentinel相关资料的时候,偶然中找到了Martin Fowler大神的一篇文章《CircuitBreaker》。于是花了点时间仔细阅读,顺便温习一下断路器CircuitBreaker的原理与实现。
CircuitBreaker的原理现实生活中的熔断器(更多时候被称为保险丝)是一种安装在电路中用于保证电路安全运行的电子元件。它的外形一般是一个绝缘的玻璃容器包裹着一段固定大小电阻和固定熔点的纤细合金导体,如下图:
电路中,保险丝会和其他用电的原件串联,根据物理公式Q = I^2*R*T(Q为热能值,也理解为保险丝熔断的极限热能值,I为电流中的电流,R为保险丝固定电阻, ...
深入理解RabbitMQ中的prefetch_count参数
前提在某一次用户标签服务中大量用到异步流程,使用了RabbitMQ进行解耦。其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和prefetch_count参数都做了调整和测试,得到一个相对合理的组合。这里深入分析一下prefetch_count参数在RabbitMQ中的作用。
prefetch_count参数的含义
var jd_union_pid="3002979359";var jd_union_euid="";
var jd_union_pid="3002833968";var jd_union_euid="";
var jd_union_pid="3002979360 ...
简化ETL工作,编写一个Canal胶水层
前提
这是一篇憋了很久的文章,一直想写,却又一直忘记了写。整篇文章可能会有点流水账,相对详细地介绍怎么写一个小型的”框架”。这个精悍的胶水层已经在生产环境服役超过半年,这里尝试把耦合业务的代码去掉,提炼出一个相对简洁的版本。
之前写的几篇文章里面其中一篇曾经提到过Canal解析MySQL的binlog事件后的对象如下(来源于Canal源码com.alibaba.otter.canal.protocol.FlatMessage):
如果直接对此原始对象进行解析,那么会出现很多解析模板代码,一旦有改动就会牵一发动全身,这是我们不希望发生的一件事。于是花了一点点时间写了一个Canal胶水层,让接 ...
阿里出品Excel工具EasyExcel使用小结
前提笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExcel。这里简单分享一下EasyExcel的使用心得。EasyExcel从其依赖树来看是对apache-poi的封装,笔者从开始接触Excel处理就选用了EasyExcel,避免了广泛流传的apache-poi导致的内存泄漏问题。
引入EasyExcel依赖引入EasyExcel的Maven如下:
<dependency> <groupId>com.alibaba&l ...
使用开源文档工具docsify,用写博客的姿势写文档
前提
下面的简介摘抄自docsify的官网 https://docsify.js.org 中的简介
docsify是一个神奇的文档网站生成器。他可以快速帮你生成文档网站。不同于GitBook、Hexo的地方是它不会生成静态的.html文件,所有转换工作都是在运行时。如果你想要开始使用他,只需要创建一个index.html就可以开始编写文档并直接部署在GitHub Pages(码云Pages、阿某云OSS或者鹅云COS等等)。它的主要特性如下:
无需构建,写完文档直接发布(运行时markdown文档转换)
容易使用并且轻量(压缩后 ~21kB,当然这里不包括markdown文档的大小)
智能 ...
硬核干货:3W字从源码上分析JUC并发组件CountDownLatch的实现原理
前提之前已经花了大量时间分析同步器框架AQS的源码实现,这篇文章分析一下CountDownLatch的源码实现,本文参看的JDK源码为JDK11,其他版本不一定适合。
CountDownLatch其实是复合名词,由单词countdown和latch复合而来。countdown是倒数的意思,而latch则是闩锁、闭锁的意思,复合词容易让人联想到预先设定一个计数值,并且”锁住(阻塞)”一些东西(线程),然后进行倒数,当数值减少到0的时候进行”放行(解除阻塞)”。
CountDownLatch是AQS共享模式下的典型实现。本文会先简单介绍CountDownLatch的基本API、类比监视器方式的 ...
Canal v1.1.4版本搭建HA集群
前提Canal上一个正式版是于2019-9-2发布的v1.1.4,笔者几个月前把这个版本的Canal推上了生产环境,部署了HA集群。过程中虽然遇到不少的坑,但是在不出问题的前提下,Canal的作用还是非常明显的。上周的一次改造上线之后,去掉了原来对业务系统订单数据通过RabbitMQ实时推送的依赖,下游的统计服务完全通过上游业务主库的binlog事件进行聚合,从而实现了核心业务和实时统计两个不同的模块解耦。
这篇文章简单分析一下如何搭建生产环境下可靠的Canal高可用集群。
Canal高可用集群架构Canal的HA其实包含了服务端HA和客户端的HA,两者的实现原理差不多,都是通过Zook ...
硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
前提很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。之前在分析扩展线程池实现可回调的Future时候曾经提到并发大师Doug Lea在设计线程池ThreadPoolExecutor的提交任务的顶层接口Executor只有一个无状态的执行方法:
public interface Executor { void execute(Runnable command);}
而ExecutorService提供了很多扩展方法底层基本上是基于Executor#execute()方法进行 ...
硬核干货:5W字17张高清图理解同步器框架AbstractQueuedSynchronizer
前提并发编程大师Doug Lea在编写JUC(java.util.concurrent)包的时候引入了java.util.concurrent.locks.AbstractQueuedSynchronizer,其实是Abstract Queued Synchronizer,也就是”基于队列实现的抽象同步器”,一般我们称之为AQS。其实Doug Lea大神编写AQS是有严谨的理论基础的,他的个人博客上有一篇论文《The java.util.concurrent Synchronizer Framewor》,可以在互联网找到相应的译文《JUC同步器框架》,如果想要深入研究AQS必须要理解一下该论 ...
百万级别数据Excel导出优化
前提这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。
笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现了服务经常因为大数据量的数据导出频繁Full GC,导致应用假死无法响应外部的请求。因为某些原因,该服务只能够分配2GB的最大堆内存,下面的优化都是以这个堆内存极限为前提。通过查看服务配置、日志和APM定位到两个问题:
启动脚本中添加了CMS参数,采用了CMS收集器,该收集算法对内存的敏感度比较高,大批量数据导出容易瞬间打满老年代导致Full GC频繁发生。
数据导出的时候采用了一次性把目标数据全 ...