08 2024 档案
摘要:概述 对于后端Java开发人员来说,锁主要有Java锁和DB锁。Java锁,请参考一文总结Java开发各种锁。本文所述的DB锁,可能会局限于MySQL数据库。 隔离级别与锁的关系 在RU级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突 在RC级别下,读操作需要加共享锁,但是在语
阅读全文
摘要:概述 在使用公司内部后台系统测试环境时发现一个请求加载慢的问题,简简单单的列表,查询MongoDB数据库,测试环境不过几百上千条数据而已,请求耗时居然高达5~6秒: 作为对比,生产环境的请求响应截图如下: 经过持续跟进,该后台系统所有列表页面测试环境普遍比生产环境慢,不管是MongoDB还是MySQ
阅读全文
摘要:概述 本文记录一次升级Apollo Client组件到1.7.0后遇到的重大生产事故。只想看结论的,可直接快进到文末。实际上,第一句话就是一个结论。 另,本文行文思路事后看起来可行略显思路清晰,实际上排查生产问题时如无头苍蝇,各种猜想各种否定猜想,各种排除各种验证。 另另,回滚服务有时候是一个法宝。
阅读全文
摘要:概述 事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特性,即原子性、一致性、隔离性和持久性。 分类 大多数情况下,分类是没有意义的一件事。但是分类可以一定程度上,加深理解。 实现 从实现角度来看,Java事务的类型有三种:JDBC事务、JTA(Java Transaction API
阅读全文
摘要:概述 测试环境爆出ERROR告警日志java.lang.IllegalStateException: Didn't find report for specified language,登录测试环境ELK查到如下具体的报错堆栈日志: java.lang.IllegalStateException:
阅读全文
摘要:概述 由来 长期以来系统工程师使用的建模语言、工具和技术种类很多,如行为图、IDEF0、N2图等,这些建模方法使用的符号和语义不同,彼此之间不能互操作和重用。系统工程正是由于缺乏一种强壮的标准的建模语言,从而限制系统工程师和其他学科之间关于系统需求和设计的有效通信,影响系统工程过程的质量和效率。 为
阅读全文
摘要:需求 给出一个比较常见的统计类业务需求:统计App(包括iOS和Android两大类)每日新注册用户数、以及累计注册用户数。 数据库采用MySQL,根据上面的需求,不难设计表如下: create table os_day_count( stat_date varchar(10) not null c
阅读全文
摘要:概述 分类 索引的分类: 按照索引包含的字段数量,可分为单键索引(单字段索引)和组合索引(联合索引、复合索引) 按照索引字段的类型,可以分为主键索引和非主键索引 按照索引节点与物理记录的对应方式来分,可以分为聚簇索引和非聚簇索引,其中聚簇索引是指索引节点上直接包含了数据记录,而后者则仅仅包含一个指向
阅读全文
摘要:概述 关系型数据库MySQL有InnoDB存储引擎,存储引擎很大程度上决定着数据库的性能。 在MongoDB早期版本中,默认使用MMapV1存储引擎,其索引就是一个B-树(也称B树)。 从MongoDB 3.0开始引入WiredTiger(以下简称WT)存储引擎,在性能及稳定性上都有明显的提升。从M
阅读全文
摘要:概述 说到MongoDB客户端,不要太多,有免费的也有付费的。每个人都有他习惯使用的客户端IDE。除JetBrains公司出品的超强DataGrip外,Robot 3T值得一提。 Robot 3T,用C++编写,有限开源免费,部分高级功能需要付费购买license,现已更名为Studio 3T。 实
阅读全文
摘要:缘由 MongoDB数据库如下: 如上截图,使用MongoDB客户端工具DataGrip,在filter过滤框输入{ 'profiles.alias': '逆天子', 'profiles.channel': '' },即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求:用Java代码来查询指定渠
阅读全文
摘要:概述 最多可设置6级标题 技巧 列表 有序列表 MD语法: 1. 你好 2. 我也好 呈现效果: 你好 我也好 无序列表 MD语法: - a - b * aa * bb + aaa + bbb 效果: a b aa bb aaa bbb 结论,支持三种方式:-、*、+ TODO列表 MD语法: -
阅读全文
MapStruct+Maven+Lombok问题NoSuchBeanDefinitionException、does not have an accessible empty constructo排查
摘要:概述 先直接说我遇到的问题吧,Spring Boot应用启动失败: ERROR | org.springframework.boot.web.embedded.tomcat.TomcatStarter | onStartup | 61 | - Error starting Tomcat contex
阅读全文
摘要:进程 进程process是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。 进程状态 在进程的生命周期内,进程总会从一个状态转变到另一个状态。Linux中,一个进程有下面的可能状态: Running:正在运行(它是系统中的当前进程)或准备
阅读全文
摘要:概述 Gossip协议,又称epidemic协议,基于流行病传播方式的节点或进程之间信息交换的协议,在分布式系统中被广泛使用。 在1987年8月由施乐-帕洛阿尔托研究中心发表ACM上的论文《Epidemic Algorithms for Replicated Database Maintenance
阅读全文
摘要:概述 在应用工程里看到如下被标记为@deprecated的代码,这对有代码洁癖的我而言是无法忍受的: row.getCell(10).setCellType(Cell.CELL_TYPE_STRING); String hospital = row.getCell(0).getStringCellV
阅读全文
摘要:概述 工作即将满8年,如果算上2年实习的话,满打满算我已经走过将近10年的程序员编码生涯。关于Spring Boot知识点,关于微服务理论,也已经看过好几本书籍,看过十几篇技术Blog,甚至自己也写过相关技术Blog。 无论是Spring Boot,还是微服务,这些我们都可以称之为编程职业硬技能。这
阅读全文
摘要:环境搭建 定义变量名时要遵循的规则: 变量名必须以字母或下画线开始,名字中间只能由字母、数字和下画线组成 长度不能超过255个字符 变量名在有效范围内必须具有唯一性 不能使用保留字(关键字) 区分大小写 不能对元组中的元素做修改,只能做切片查询。如果元组中只有1个元素,则需要在这个元素的后面加上逗号
阅读全文
摘要:监控简介 Google服务层次结构图,监控是底座 一些监控反模式: 事后监控 机械式监控 不(够)准确的监控 静态监控:不是说超过某个绝对阈值系统就一定出现问题,更有意义的监控是对比(环比)动态监控。数据库性能分析供应商VividCortex的首席执行官Baron Schwartz对此评论道[插图]
阅读全文
摘要:概述 Dynamic programming,简称DP,动态规划,基础算法之一,维基百科的解释: 是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往
阅读全文
摘要:概述 算法是一个程序员的核心竞争力,也是面试最重要的考查环节。本文整理一些与回文相关的基础算法题。注:本文语言为Java。 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。给定一个字符串s,如果是回文串,返回t
阅读全文
摘要:概述 在Java中要想实现线程,有四种手段: 继承Thread类 实现java.lang.Runnable接口 实现java.util.concurrent.Callable泛型接口, 利用线程池 线程池通过线程复用机制,并对线程进行统一管理,优点: 降低系统资源消耗。通过复用已存在的线程,降低线程
阅读全文
摘要:概述 TimingWheel,时间轮,简单理解就是一种用来存储若干个定时任务的环状队列(或数组),工作原理和钟表的表盘类似。 关于环形队列,请参考环形队列。 时间轮由两个部分组成,一个环状数组,一个遍历环状数组的指针。 首先定义一个固定长度的环状数组,队列中的每一个元素代表一个时间格(可以精确到秒或
阅读全文
摘要:信号量 在并发系统中,信号量是用于控制公共资源访问权限的变量。信号量用于解决临界区问题,使得多任务环境下,进程能同步运行。此概念是由荷兰计算机科学家Dijkstra在1962年左右提出的。信号量仅仅跟踪还剩多少资源可用,不会跟踪哪些资源是可用的。 信号量机制,处理进程同步和互斥的问题。信号量的一大特
阅读全文
摘要:概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。跨域是浏览器(如Chrome浏览器基于JS V8引擎,可以简单理解为JS解释器)的一种同源安全策略,是浏览器单方面限制脚本的跨域访问。因此,仅有客户端运行在浏览器时才存在跨域问题,才需要考虑如何解决这个问题。 浏览器控制台输
阅读全文
摘要:概述 DNS是一个缩写,可以代表Domain Name System,域名系统,是互联网的一项基础服务。也可以代表Domain Name Server,域名服务器,是进行域名和与之相对应的IP地址相互转换的服务器。DNS协议则是用来将域名转换为IP地址(也可将IP地址转换为相应的域名地址)。 当前,
阅读全文
摘要:概述 代理在计算机编程领域,是一个很通用的概念,包括:代理设计模式,代理服务器等。 代理类持有具体实现类的实例,将在代理类上的操作转化为实例上方法的调用。为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责
阅读全文
摘要:概述 基本概念 磁盘有正反两个盘面,每个盘面有多个同心圆,每个同心圆是一个磁道,每个同心圆又被划分为多个扇区,数据就被存在扇区中。 磁头首先寻找到对应磁道,然后等到磁盘进行周期旋转到指定的扇区,才能读取到对应的数据。存取时间 = 寻道时间 + 等待时间 盘面号(磁头号):0 ~ M-1;由于一个盘面
阅读全文
摘要:概述 关于面试中常见的其他二叉树算法题,参考面试+算法之二叉树(Java)。二叉树的定义(注意到有使用lombok提供的两个注解): @lombok.Data @lombok.AllArgsConstructor private static class TreeNode { private Tre
阅读全文
摘要:背景 在分布式系统中,当数据库数据量达到一定量级后,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保证在单个表中唯一,所以需要一个在分布式环境下都能使用的全局唯一ID。 应用场景 用户ID、图片ID等各种业务场景 分库分表情况下的订单号
阅读全文
摘要:概述 不管是计算任务还是数据存储都会涉及资源分配,资源包括但不限于硬件资源如CPU、内存、硬盘、网口。在单机环境中,资源管理相对简单;分布式环境中,资源分布相对分散,如何协调资源应对计算任务和数据存储就是亟待解决的问题。 资源管理和调度是将计算任务分配到资源的过程,为了处理并发的计算任务,系统会通过
阅读全文
摘要:概述 Java Microbenchmark Harness,简称JMH,由OpenJDK开发,用来构建、运行和分析Java或其他JVM语言代码的微基准测试框架。适合于方法级别的细粒度测试,并不适用于系统之间的链路测试。 为什么需要JMH,也就是需求产生 死码消除:所谓死码,是指注释的代码,不可达的
阅读全文
摘要:简介 官网:https://zookeeper.apache.org/index.html 分布式服务协调组件,Google Chubby的开源实现。解决分布式应用中的以下问题:配置管理、命名服务(Naming Service)、集群管理、统一命名服务、状态同步。 用于解决分布式数据一致性问题,提供
阅读全文
摘要:概述 SkipList,跳表,跳跃表,在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中,跳跃表使用概率均衡技术而不是使用强制性均衡,因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lists are data structures that use
阅读全文
摘要:背景 SOA或微服务架构体系下必不可少的一个分布式组件,常用于解决分布式场景下数据一致性的问题。 应用场景: 资源竞争控制:在分布式系统中,多个节点可能同时访问共享资源,如数据库、文件系统、缓存等。分布式锁可以用来控制对这些共享资源的访问,确保在任何时候只有一个节点能够对资源进行修改,避免数据的并发
阅读全文
摘要:引言 在营销系统里,为了增加系统的活跃用户数,经常会有各种各样的营销活动。这类活动几乎都是为了充分利用存量用户的价值,促使他们分享产品或App以达到触达到更多用户的目的。又或者是出于营销目的,群发优惠券触达短信这种场景。 分享App活动页(或其他各种页面)时URL一般会带有各种参数,比如分享者fro
阅读全文
摘要:注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。 概述 概念 关系,就是二维表。特性: 列不可分性:关系中每一列都是不可再分的属性,即不能出现如下复合属性 行列无序性:交换列的前后顺序不
阅读全文
摘要:概述 关于TCP的杂乱知识点,不成体系,毕竟TCP真的太复杂。 TCP,Transmission Control Protocol;IP,Internet Protocol,两者共同组成TCP/IP协议族,包含一系列构成互联网基础的网络协议。 OSI七层网络模型 图片来自于OSI七层网络模型 OSI
阅读全文
摘要:概述 在高并发场景下,请求量瞬间到达,后端服务器即使有缓存、集群主备、分库分表、容错降级等措施,也有可能扛不住这请求量,因此可考虑引入限流组件。限流的目的:防止恶意请求流量或流量超出系统承载。 应用场景: 网关层校验流量,拦截非法请求,或直接抛弃部分流量(后来的流量,如秒杀系统) 实时场景下的数据迁
阅读全文
摘要:概述 ZooKeeper Atomic Broadcast,ZooKeeper原子消息广播协议。ZAB协议是为分布式协调服务ZK专门设计的一种支持崩溃恢复的原子广播协议。ZK主要依赖ZAB协议来实现分布式数据的最终一致性,基于该协议,ZK实现一种主备模式的系统架构来保持集群中各个副本之间的数据一致性
阅读全文
摘要:概述 作为一个8年多Javaer,曾无数次看到Unsafe这个类,但一直没有去翻过源码,此为背景。 借助于IDEA查看JDK源码,却发现有两个Unsafe类: sun.misc.Unsafe jdk.internal.misc.Unsafe jdk.internal.misc.Unsafe和sun.
阅读全文
摘要:概述 任何一个登录系统的密码不能明文存储,万一发生数据库泄漏事故(不管是内部人员导出数据库数据还是被黑客攻击破解数据库实例节点拿到数据库数据等,又或者是其他情况造成的),将产生巨大的损失。因此明文密码在存储到数据库之前需要加密处理。 加密算法有很多,大致有如下分类: 哈希函数算法:包括消息摘要算法(
阅读全文
摘要:概述 与Spring、Spring MVC、Spring Boot一样,Spring Security里也有很多Handler接口、可以分为两大类,一类是普通的XxxHandler(见名知意),另一类是对应的ServerXxxHandler(RequestRejectedHandler除外)。 以A
阅读全文
摘要:概述 负载均衡 负载均衡,即Load Balance,LB,通器常有两种实现手段,服务端和客户端。 负载均衡器,是带有负载均衡功能的实体(或载体),本文不做严格区分;即缩写LB,可表示负载均衡策略,也可以表示负载均衡器。 服务端LB的缺点,提供更强的流量控制权,但无法满足不同的消费者希望使用不同负载
阅读全文
摘要:概述 Redis事务提供一种将多个命令打包,然后一次性、按顺序地执行的机制,在事务执行的期间不会主动中断,服务器在执行完事务中的所有命令之后,才会继续处理其他客户端的其他命令。 三个重要的保证: 批量操作在发送EXEC命令前被放入队列缓存 收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余
阅读全文
摘要:概述 Redis主从集群,一主多从模式,包括一个Master节点和多个Slave节点。Master负责数据的读写,Slave节点负责数据的查询。Master上收到的数据变更,会同步到Slave节点上实现数据的同步。通过这种架构实现可以Redis的读写分离,提升数据的查询性能。 主从集群不提供容错和恢
阅读全文
摘要:概述 Redis 2.8版本发布稳定版Redis Sentinel,不过Sentinel集群版存在一些问题: 高可用性:Sentinel集群对Redis既有的主从集群提供有限的高可用保障; 在线扩容:节点下线,触发选举,选举涉及两个阶段;新增节点,数据迁移过程麻烦。 对比Redis Sentinel
阅读全文
摘要:概述 Point-to-Point Protocol,点到点协议,工作于数据链路层,在链路层上传输网络层协议前验证链路的对端,主要用于在全双工的同异步链路上进行点到点的数据传输。 PPP主要是用来通过拨号或专线方式在两个网络节点之间建立连接、发送数据。PPP是各类型主机、网桥和路由器之间简单连接的一
阅读全文
摘要:概述 无论是C端产品页面,还是后台系统页面,不可能一次性将全部数据加载出来。后台系统一般都是PC端登录,用Table组件(如Ant Design Table)渲染展示数据,可点击列表的下一页(或指定某一页)查看数据。C端产品如App,在下滑时可查看更多数据,看起来像是一次性加载数据,实际上也是分批请
阅读全文
摘要:基础 简介 特点: 高吞吐、低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒,每个Topic可以分多个Partition,Consumer Group对Partition进行Consumer操作 可扩展性:Kafka集群支持热扩展 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备
阅读全文
摘要:概述 在ConcurrentSkipListMap里看到VarHandle,记录一下学习笔记。 VarHandle,变量句柄,是新的原子访问属性规范,JDK8以前都是通过sun.misc.Unsafe实现原子属性访问。见名知意,Unsafe是不安全API,理解不透彻使用不正确,会有意想不到的问题。从
阅读全文
摘要:概述 所有异常都是继承自java.lang.Throwable类,Throwable有两个直接子类,Error和Exception。 Error用来表示程序底层或硬件有关的错误,这种错误和程序本身无关,如常见的NoClassDefFoundError。这种异常和程序本身无关,不需要检查,属于非受检异
阅读全文
摘要:概述 SPI,Service Provider Interface,一种服务发现机制,指一些提供给你继承、扩展,完成自定义功能的类、接口或方法。 在SPI机制中,服务提供者为某个接口实现具体的类,而在运行时通过SPI机制,查找到对应的实现类,并将其加载进行使用。 JDK 6(参考java.util.
阅读全文
摘要:概述 日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志,可以在程序出现问题时帮助开发人员迅速地定位错误的根源。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。 System.out.println、System.err.pr
阅读全文
摘要:概述 在Java开发中,我们会看到各种各样的对象(实体)类,包括: POJO:Plain Old Java Object,普通Java对象 VO:View Object,视图对象,返回给前端用于展示层,将某个页面(组件)的全部(或部分)数据封装到一个对象里,有些公司将其定义为**Resp对象,; V
阅读全文
摘要:概述 G1首次出现是在JDK 6u14版本里作为体验版,JDK 7u4版本被正式推出,JDK 9中被设置为默认垃圾收集器(参考JEP 248)。 G1全称是Garbage First,目标:延迟可控的情况下,尽可能高的吞吐量。一款区域化分代式GC。 内存布局 G1是一个并行回收器,把堆内存分割为很多
阅读全文
摘要:简介 Consul,HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更一站式,内置服务注册与发现框架、分布一致性协议实现、健康检查、K/V存储、多数据中心方案,不再需要依赖其他工具(如ZooKeeper等)。使用Go语言编
阅读全文
摘要:注:本文是《这就是推荐系统》的读书笔记。 概述 互联网公司想要增加活跃用户、增加收入,通常会想尽各种各样的方法、运作、策略等。有一套称作AARRR的运营方式广受欢迎: 步骤如下: 首先是获取用户(Acquisition),怎样使用一种比较高效的方式(App引流、网站跳转、百度或淘宝买广告曝光位)来获
阅读全文
摘要:概述 AbstractQueuedSynchronizer,抽象队列同步器,简称AQS,用于构建同步器,抽象类,是JUC包下CountDownLatch、ReentrantLock、RenntrantReadWriteLock、Semaphore、ThreadPoolExecutor实现的基础。支持
阅读全文