04 2021 档案
摘要:线上系统突然运行缓慢,如果导致系统不可用,首先导出jsatck和内存信息,重启系统,尽快保证系统的可用性。 1、出现问题的原因 一种是由计算导致的CPU使用过高,一种是由内存不足垃圾回收导致的CPU使用过高。 1. 频繁发生FULL GC 2. 线程太多,上下文不停切换,比如大量线程激烈的锁竞争,线
阅读全文
摘要:13.1 同步阻塞调用 13.2 异步Future private void FutureTest() { //请求 Future<?> userInfoTask = POOL.submit(() -> {/**请求客户信息**/}); Future<?> orderInfoTask = POOL.
阅读全文
摘要:每个用户请求进入服务,我们使用拦截器做一些前置处理,譬如查询用户的个人信息,将结果保存到线程本地变量中。在整个请求中,都能随时从堆缓存中拿到这部分信息。 相信大家也经常使用这种办法,但是某次遇到一个bug,那就是在主线程中使用异步线程去查询其他系统的信息,而异步线程是没有存这个本地变量的!结果喜闻乐
阅读全文
摘要:整体分成三部分缓存:应用Nginx本地缓存、分布式缓存、Tomcat堆缓存。 每层都用来解决相关问题,第一层解决热点缓存的问题,第二层减少访问回源率,第三层防止相关缓存失效/崩溃之后的冲击 11.2 如何缓存数据 11.2.1 过期与不过期 过不过期应该根据业务和数据量等因素决定 不过期缓存的场景
阅读全文
摘要:让数据更贴近使用者 9.3 缓存回收策略 1. 基于空间:到达存储空间上限 2. 基于容量:缓存的条目超过上限 3. 基于时间 TTL(Time To Live):存活期,超过过期时间被回收 TTI(Time To Idle):空闲期,空闲多长时间被回收 4. 基于Java对象引用:软引用/弱引用引
阅读全文
摘要:回滚是指当程序/数据出错时,将数据和程序恢复到最近的一个正确版本的行为。 常见的如事务回滚、代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。 7.1 事务回滚 单库的回滚比较简单,分布式数据库,回滚则要使用分布式事务,见分布式事务笔记。底层实现如2PC,3PC长时间阻塞会影响性能。不需要
阅读全文
摘要:超时:如果不设置超时时间,慢请求累积导致连锁反应,造成应用雪崩。超时主要处理的是网络连接和读写超时 重试:重试次数不能太多,否则会把请求数放大数倍,应该和熔断、快速失败机制配合 6.2 代理层超时与重试 6.2.1 Nginx 提供了 客户端超时设置、DNS解析超时设置、代理超时设置、Lua相关超时
阅读全文
摘要:当服务出现问题,要保证服务起码可用,即使服务是有损的,这时候就需要使用降级策略,返回“不那么完善”的服务。另一层含义是,当系统资源紧张时,对非核心业务进行降级,保证核心业务的稳定 5.1 降级预案 梳理出哪些服务需要保护,哪些可降级。 按照是否自动化分为:自动开关降级和人工开关降级 按照功能分为:读
阅读全文
摘要:限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,将流量削峰防止系统挂掉或雪崩,最终做到有损服务而不是不服务。 4.1 限流算法 4.1.1 令牌桶算法 4.1.2 漏桶算法 4.1.3 计数器限流 比如用Redis的有序集合限流 4.2 应用级限流 4.2.1 限
阅读全文
摘要:当服务发生故障不可用后,限定传播范围和影响范围,防止出现雪球效应。 3.1 线程隔离 将请求分类,交给不同的线程池处理(RocketMQ的broker各种线程池)。当一个业务请求发生问题时,不会将故障扩散到其他线程池。 3.2 进程隔离 将系统按业务拆分成多个子系统实现物理隔离。 3.3 集群隔离
阅读全文
摘要:设计系统时思考墨菲定律 1. 任何事都没有表面看起来那么简单 2. 所有事都会比预计的时间长 3. 可能出错的事总会出错 4. 如果某个事可能发生,那么一定会发生 系统划分时思考康威定律 1. 系统架构是公司组织架构的反映 2. 应该按照业务闭环进行系统拆分/组织架构划分,实现闭环/高内聚/低耦合,
阅读全文
摘要:1. 事务的传播属性 1. REQUIRED:默认属性,如果当前已有事务,则加入并且忽略自身的设置,否则自己创建一个新的事务 2. MANDATORY:支持当前事务,若当前没有事务则抛出异常 3. NEVER:以非事务方式运行,如果当前存在事务,则抛出异常 4. NOT_SUPPORTED:以非事务
阅读全文
摘要:之前了解Synchronized不多,只知道同步代码插入了两个字节码指令,同步方法提前获取管程。近来看了很多写的很好的博客,了解了底层的实现方法。这里做一下记录,主要还是拾人牙慧。 Synchronized底层使用c++实现,在JDK1.6之后,加入了很多优化的技术,减少线程阻塞和唤醒的开销,具体可
阅读全文
摘要:13.2.2 线程安全的实现方法 同步:保障线程安全的一种手段,多线程并发访问共享数据时,保证共享数据在同一时刻只被一条(或一些)线程使用。 1. 互斥同步:互斥是实现同步的一种手段。比如synchronized关键字,Lock接口的实现。synchronized是一个重量级锁,阻塞和唤醒线程涉及到
阅读全文
摘要:1. JDK1.7下的HashMap 1. put操作 1. 判断key是否为空,为空则插入index=0的位置 2. 根据 hash(key) & (size - 1) 计算出index,在哈希表中找到对应位置 2.1 对应位置为空,放置新节点 2.2 对应位置不为空,遍历查找key和哈希值都相同
阅读全文
摘要:1. MySQL常见的日志 1. 错误日志:对MySQL的启动、运行、关闭过程进行记录。不仅记录了错误信息,还记录了一些警告信息或者正确信息 2. 慢查询日志:记录超过设定阈值的慢SQL 3. 查询日志:记录所有对数据库的请求信息,无论这些请求是否得到了正确执行 4. 二进制日志:记录了对数据库执行
阅读全文
摘要:1. BeanPostProcessor和BeanFactoryPostProcessor的区别 BeanPostProcessor:作用于Bean实例的创建前和创建后,比如AOP功能。 BeanFactoryPostProcessor:做用于BeanDefinition对象的,在BeanDefin
阅读全文
摘要:1. 循环依赖问题 spring创建一个Bean实例分为三步,实例化,依赖注入和初始化。 实例化的方式分为两大类:工厂方法(静态工厂方法和实例工厂) 和 构造器方法(默认和自动装配)。以一个例子来说下,一个类AppleTree,有一个成员变量Apple public class Apple { Ap
阅读全文
摘要:AQS概念 AQS是用于构建锁和同步器的框架。ReentrantLock、信号量、闭锁、FutureTask等等都是基于AQS构建的。其内部封装了对等待线程队列维护,同时开放接口自定义共享资源的获取和释放。 AQS负责管理同步器类中状态的整数信息,通过getState,setState和compar
阅读全文
摘要:1. 核心参数 核心线程数,最大线程数,非核心线程生存时间,任务队列,线程工厂,任务溢出策略。 2.线程池状态 1.RUNNING:线程池创建完毕后进入运行中 2.SHUTDOWN:执行shutDown方法,不再接收任务,但会处理现有的任务包括队列中的任务 4.STOP:执行shutDownNow方
阅读全文
摘要:5.1 同步容器类 Vector,Hashtable。对所有公有方法都是同步方法,使用synchronized修饰 5.1.1 同步容器类的问题 特殊情况还是需要客户端加锁。比如线程A遍历容器元素,线程B对同一个容器删除元素,会出现并发修改异常。解决办法是在客户端封装一层加锁方法。 public s
阅读全文

浙公网安备 33010602011771号