高可用和稳定性

多副本 1. 本地缓存多副本 2. Redis多副本 3. MySQL多副本 4. 消息中间件多副本 隔离、限流、熔断和降级 隔离 定义:将系统或资源分割开,在系统发生故障时能限定传播范围和影响范围,即发生故障后不会出现滚雪球效应 1. 数据隔离 2. 机器隔离 3. 线程池隔离:为了某个rpc接口较慢导致线程池打满,为不同的rpc接口提供不同的线程池 4. 信号量隔离:为了解决线程数过多导致上下文切换开销的大问题,共用线程池但是取线程之前需要获得信号量,信号量达到阈值则无法获取线程 限流 定义:系统的处理能力不能应对外部请求的涂增流量时,为了不让系统崩溃(如线程池资源耗
阅读更多

leetcode 45.跳跃游戏II

https://leetcode.com/problems/jump-game-ii/ 45.跳跃游戏 II 你被给了一个长度为 n 的整数数组 nums,索引从 0 开始。你最初位于 nums[0]。 数组中的每个元素 nums[i] 代表从索引 i 出发的最大向前跳跃长度。换句话说,如果你在 nums[i],你可以跳到任何 nums[i + j],其中: * 0 <= j <= nums[i] 且 * i + j < n 返回到达 nums[n - 1] 的最小跳跃次数。测试用例生成保证你可以到达 nums[n - 1]。 示例 1: 输入:nums = [2,3,1,1
阅读更多

leetcode 31. 下一个排列

https://leetcode.com/problems/next-permutation/description/ 31.下一个排列 整数数组的排列是将其成员排列成序列或线性顺序。 * 例如,对于arr = [1,2,3],arr的所有排列如下:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]。 整数数组的下一个排列是它的整数下一个字典序排列。更正式地说,如果将数组的所有排列按字典序排序放入一个容器中,那么该数组的下一个排列就是排序容器中紧随其后的排列。如果无法进行这种排列,则数组必须重新排列为最低可能的顺序(即按升序排序)。
阅读更多

leetcode 33.在旋转排序数组中搜索

https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 33.旋转有序数组中的搜索[中等] 有一个整数数组nums,按升序排序(值各不相同)。在传递给您的函数之前,nums可能被一个未知的枢轴索引k(1 <= k < nums.length)旋转,使得得到的数组为[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](索引从0开始)。例如,[0,1,2,4,5,6,7]可能在枢轴索引3处旋转并变为[4,5,6,7,0,1,
阅读更多

项目回顾

大数据离线任务调度系统 定义 大数据离线任务调度系统 是指用于 管理、编排和执行批处理(离线)数据任务 的平台,它确保 数据在正确的时间、以正确的依赖关系顺序、在正确的计算资源上被处理,以支持数据仓库建设、ETL流程、数据分析、数据报表等工作。 上下游关联:上层是数据开发平台、BI平台、机器学习平台等等,下层是Spark、MR、异步数据源同步引擎等底层引擎 运行频率:一般是分钟级、小时级、日级 痛点问题 * 调度时延高:对于到达就绪时间的任务,旧架构下采取轮询的模式从DB查询任务,时延较高 * 有状态服务:服务内存中存储DAG结构,服务重启或故障情况下需要恢复内存状态 * 单点问题:服
阅读更多

操作系统

操作系统相关书籍:《Linux是怎样工作的 - [日]武内觉》 存储层次 高速缓存 从内存直接和寄存器之间做数据拷贝很慢,高速缓存的存在,正是为了抹平寄存器与内存之间的性能差距。 读取数据 从内存读取数据时,数据显呗送往高速缓存,在被送往寄存器,读取的数据大小取决于缓存块大小(cache line size),该值由各个CPU规定。 假设缓存块的大小为 10 字节,高速缓存的容量为 50 字节,并且存在两个长度为 10 字节的寄存器(R0 与 R1)。在这样的运行环境下,把内存地址 300 上的数据读取到 R0 时的情形如图 6-2 所示。此后,当 CPU 需要再次读取地址 300 上的
阅读更多

Java-JVM原理

Java内存模型 JMM TODO JVM内存区域 * 程序计数器:线程私有的,jvm通过改变计数器的值来选取下一条需要执行的字节码指令,唯一一个没有规定任何OutOfMemoryError情况的区域 * Java虚拟机栈:线程私有的,每个方法执行时创建栈帧,方法被调用就是栈帧在栈中从入栈到出栈的过程。栈帧的组成部分如下, * 局部变量表:存放编译期可知的各种jvm基本数据类型、对象引用。todo 待完善 * 操作数栈: * 动态链接: * 方法返回地址: * 本地方法栈:线程私有的,本地(Native)方法所
阅读更多
计算机知识拓扑

Java-语言基础

概念 编译型语言和解释型语言的区别 * 编译型语言:在程序执行之前,整个源代码会被编译成机器码或者字节码,生成可执行文件。执行时直接运行编译后的代码,速度快,但跨平台性较差。 * 解释型语言:在程序执行时,助航解释执行源代码,不生成独立的可执行文件。通常由解释器动态解释并执行代码,跨平台性好,但执行速度相对较慢。 典型的编译型语言如C、C++,但型的解释型语言如Python、JavaScript 数据类型 基础数据类型及其包装类型,缓存池 关于几种初始化Integer方式,初始化对象的区别 代码示例 >folded1 2 3 4 5 6 7 8 9 10 11 12 13 14
阅读更多

多线程顺序打印问题

三个线程分别打印 A,B,C 三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC….”的字符串 使用Lock 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import java.util.concurrent.locks.ReentrantLock; public class ABC { static class ABCPrinter { p
阅读更多