05 2022 档案
摘要:在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问,想必是每个程序看到异地多活这个名词时,都想要搞明白的问题。 一、系统可用性 要想理解异地多活,我们需要从
阅读全文
摘要:一、高可用架构三大核心原理 1、FLP 不可能原理 FLP Impossibility(FLP 不可能性)是分布式领域中一个非常著名的定理,定理的论文是由 Fischer, Lynchand Patterson 三位作者于1985年发表。其表示在基于消息传递的异步通信场景,即使只有一个进程失败,也没
阅读全文
摘要:之前写过一些多线程或者JUC的文章,最近再看并发相关的内容,又有了一些新的理解,做一个补充。 一、Thread 1、Thread和Runable 验证守护线程:如果主线程不休眠,则不会等task中的内容输出,直接停止主线程 public class DaemonThread { public sta
阅读全文
摘要:一、再谈谈什么是高性能 (一)性能指标与演示 首先明确一下,高性能涵盖:高并发用户、高吞吐量、低延迟、容量四个方面,高并发用户是指可以承载海量的并发用户,例如十万个、百万个用户同时连接和并发访问,不会造成系统崩溃;吞吐量就是我们常说的TPS、QPS,即每秒的查询数和事务数;低延时指的是请求的响应速度
阅读全文
摘要:一、基础代码 首先使用BIO单线程、BIO多线程、BIO线程池的方式启动端口为8080、8081、8082三个服务,为后续做准备,同时编写客户端调用,使用HttpClient和OkHttpClient来分别调用。 1、BIO模式单线程模式 public class HttpServer01 { pu
阅读全文
摘要:在Druid连接池的工作过程中,会用到一些计数器对Druid的情况进行判断。然后根据计数器的数据采取一系列操作,整理如下: 1.统计类的计数器 变量名 类型 说明 connectCount long getConnectionInternal被调用之后就会增加,意味着连接被get的次数。 close
阅读全文
摘要:DruidPooledConnection中的状态: 字段 类型 所在类 默认值 说明 closed volatile boolean DruidPooledConnection false 关闭状态,recycle到连接池中的连接会修改为true。但是这个状态通常只在checkStateInter
阅读全文
摘要:有关于Druid的removeAbandoned机制,在getConnection源码中介绍过。removeAbandoned实际上就是Druid的泄露检测机制。主要的参数有: 参数 说明 removeAbandoned 如果连接泄露,是否需要回收泄露的连接,默认false; logAbandone
阅读全文
摘要:Druid中的Connection在使用之后,要进行回收,而回收连接的方法就是recucle方法。 回收的主要目的是将连接的状态清空/重置之后,放置到连接池的connections数组的尾部,然后发送连接池lock的notEmpty条件变量通知消息,让等待的消费者线程来获取连接。 一、回收过程 回收
阅读全文
摘要:一、微服务概述 1、SOA: SOA的核心内容是ESB,全称是 Enterprise Service Bus,SOA 通过 ESB 将企业中各个不同的异构服务连接在一起,是 SOA 架构的核心,但是SOA架构是成也 ESB,败也 ESB。 ESB的目的是松耦合马也就是减少各个服务间的依赖和互相影响,
阅读全文
摘要:在阅读DruidDataSource源码的过程中,发现DruidConnectionHolder有个特别的属性PreparedStatementPool statementPool。 根据经验可知,这是DruidPreparedStatement进行缓存的cache。我们在使用PreparedSta
阅读全文
摘要:由于微服务对应的库表拆分,导致原来在一个库中的数据可能被分散到多个数据库中,一个业务流程可能涉及多个数据库,如何保证在多个库中的数据的事务问题,是一个常见的微服务问题,一般会有强一致性和最终一致性两种解决方案,强一致性表示必须同时成功或同时失败,最终一致性表示只要最终的状态是同时成功或者同时失败即可
阅读全文
摘要:shrink方法是DestroyTask线程中回收连接的具体执行方法。 首先获得锁: try { lock.lockInterruptibly(); } catch (InterruptedException e) { return; } 之后,要判断初始化状态是否完成,如果采用异步初始化,可能De
阅读全文
摘要:一、main函数与package声明 1、main 函数概览 main函数要点:无参数、无返回值;main 方法必须要在 main 包里面;`go run main.go` 就可以执行;如果文件不叫 `main.go`,则需要`go build` 之后再 `go run`。 2、package 声明
阅读全文
摘要:一、安装Golang (一)Mac安装 1、安装 Go 打开下载网站(https://gomirrors.org/),选择安装包,下载完成,双击,一路 next,记住安装路径,安装完成打开命令行,输入命令 “go”。 输入命令没反应 —— 环境变量配置出错 默认情况下,双击安装安装完成之后,Go 会
阅读全文
摘要:DruidDataSource连接池实现了javaX.sql包中DataSource接口的全部方法。getConnection也来自于javaX.sql.DataSource接口。 而DruidPooledConnection也实现了接口java.sql.Connection。 这样就能在各种场景中
阅读全文
摘要:一、双重检测锁 在线程池初始化时,为了保证并发安全,同时为了保证初始化性能,使用了双重检测锁进行初始化,代码如下所示, 第一步的判断是为了保证效率:毕竟初始化只是在连接池没有初始化或没有初始化完成时才会去调用初始化逻辑,在大多数场景,连接池已经初始化完成,所以如果不加第一个是否已完成初始化的判断,那
阅读全文
摘要:在获取连接时,会执行初始化方法 init() ,使用 DruidDataSource的入口。 一、双检测保证并发安全与性能 为了保证不会重复初始化并且保证性能,使用了类似双重检测锁的方式来处理,第一次判断 inited 标识,如果已经初始化,则则直接返回,如果没有初始化,则使用ReentrantLo
阅读全文
摘要:一、项目介绍 1、Druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。 Github项目地址 https://github.com/alibaba/dr
阅读全文
摘要:一、线上问题分类及排查手段 如果发现线上服务变慢等情况,应该如何排查? 1、查询业务日志: 可以发现这类问题:请求压力大,波峰,遭遇降级,熔断等等, 基础服务、外部 API 依赖出现故障。 2、查看系统资源和监控信息: 硬件信息、操作系统平台、系统架构; 排查 CPU 负载、内存不足,磁盘使用量、硬
阅读全文
摘要:一、JVM线程堆栈数据分析 JVM 内部线程主要分为以下几种: VM 线程:单例的 VMThread 对象,负责执行 VM 操作; 定时任务线程:单例的 WatcherThread 对象, 模拟在 VM 中执行定时操作的计时器中断; GC 线程:垃圾收集器中,用于支持并行和并发垃圾回收的线程; 编译
阅读全文
摘要:一、验证GC代码 程序并不复杂,我们指定一个运行时间作为退出条件,时间一到自动退出循环。在 generateGarbage 方法中,我们用了随机数来生成各种类型的数组对象并返回。 在 main 方法中,我们用一个数组来随机存放一部分生成的对象,这样可以模拟让部分对象晋升到老年代。具体的持续运行时间和
阅读全文
摘要:一、延时 从事件发生到结果所需的时间就叫延迟,常见延时 可以看出,普通磁盘是有多慢,跟SSD差了一个数量级,这个数字可以告诉我们,提升数据库服务器硬件配置,就能使性能上一个台阶。 目前最快的SSD是Intel Optane(英特尔傲腾),延迟低到小于10微妙,目前已有项目基于SSD实现海量数据的缓存
阅读全文
摘要:一、多级缓存架构 1、缓存原理和设计架构 缓存 VS 缓冲: 缓存:英文单词是Cache指位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为Cache,常见的缓存有,CPU的L1/L2/L3 cache、Linux文件系统的page cache、InnoDB buffer
阅读全文
摘要:一、按照规范范围区分 根据规范范围区分(也就是规范的是所有虚拟机、还是指定一款虚拟机、还是指定一款虚拟机的指定版本),JVM的参数主要分为三类:标准参数、-X非标准参数、-XX参数。 以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容,例如下面示例的-server。 -D 设置系
阅读全文