读书列表

Copy From: awesome-architecture 分布式 分布式架构链路追踪:SkyWalking 介绍 漫谈分布式系统 (20):基于规则的优化 架构设计:分布式服务,库表拆分模式详解 走出微服务误区:避免从单体到分布式单体 熬夜之作:一文带你了解 Cat 分布式监控 初识 etcd 分布式场景下基于重试机制的一致性解决方案 一文读懂 HDFS 架构与设计 MIT 6.824 分布式系统课程第六课之错误容忍:Raft(一) 漫谈分布式事务的那些解决方案 我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了 架构设计基础:单服务、集群、分布式的基本区别和联系 用匠心精神,打造高可用分布式系统 MIT 6.824 分布式系统课程第四课:主备复制 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病 MIT 6.824 分布式系统课程第三课:GFS 分布式定时任务调度框架实践 MIT 6.824 分布式系统课程第一课:介绍笔记 2019 我的技术之路:分布式系统到分布式制造 分布式 ID 生成方案 Filebeat + Kafka + ELK 分布式日志收集 [译] 一切系统都是分布式的 (OReilly, 2015) SOSP19’ Ceph 的十年经验总结:文件系统是否适合做分布式文件系统的后端 如果有人再问你怎么实现分布式延时消息,这篇文章丢给他 中间件底层实现的分布式协议之 Raft 在分布式链路下,蚂蚁金服如何快速构建低成本、高可用联调环境? 解耦并不难:分布式系统中的解耦 分布式唯一 ID 之 Snowflake 算法 漫谈分布式系统(一):为什么要有分布式系统 技术中台:分布式架构在蚂蚁金服的实践 图解各路分布式 ID 生成算法 ElasticDL:蚂蚁金服开源基于 TensorFlow 的弹性分布式深度学习系统 逻辑时钟:如何刻画分布式中的事件顺序 线性一致性实现原理剖析 XSQL:低门槛、易部署、更稳定的多数据源分布式查询引擎 分布式消息系统设计要点 React Native 分布式热更新系统 端到端一致性,流系统 Spark/Flink/Kafka/DataFlow 对比总结 盘点 Zookeeper 在分布式架构中的应用 [译] 分布式系统经典论文:Google Bigtable 的设计和实现 (OSDI 2006) [译] 分布式系统经典论文:Amazon Dynamo 的设计和实现 (SOSP 2007) Apollo 配置中心:分布式部署 分布式系统原理介绍 高并发场景下分布式实时信令系统的架构实践 8 个月打磨,一份送给程序员的 “分布式系统” 合集 分布式系统关注点:360° 的全方位监控 设计一个分布式 RPC 框架 分布式时序数据库 QTSDB 的设计与实现 轻松构建微服务之分布式配置中心 分布式系统关注点:构建易测试系统的 “六脉神剑” 个推基于 Zipkin 的分布式链路追踪实践 MXNet 结合 kubeflow 进行分布式训练 分布式数据缓存中的一致性哈希算法 聊一聊分布式对象存储解决方案 分布式系统关注点:阻塞与非阻塞有什么区别? UidGenerator:百度开源的分布式 ID 服务 如何设计一个优秀的分布式系统? 分布式 ID 生成策略 从一个真实的分布式 ID 案例看如何做架构 近万字长文,设计分布式系统需要考虑因素的都在这里 分布式 TensorFlow 编程模型演进 基于 Redis 和 Lua 的分布式限流 Aloha:一个分布式调度框架的设计与实现 可线性化检查:与 NP 完全问题做斗争 分布式架构设计之架构演进之路 分布式系统设计经典论文 Leaf:美团分布式 ID 生成服务开源 宜信分布式安全服务编排实践 xxl-registry:轻量级分布式服务注册中心 CAP 一致性协议及应用实践 分布式系统关注点:弹性架构 Etcd Raft 使用入门及原理解析 滴滴开源分布式消息中间件产品 DDMQ 企业实施分布式架构的挑战以及应对建议 云端分布式架构下的编程语言:elixir; pattern matching 让 Raft 变快 100 倍:Dragonboat 的写优化 GMKV:分布式 kv 在更美 App 的落地 基于 Licode 的 WebRTC 全球分布式架构 手绘 raft 一致性算法 kingbus:基于 Raft 的分布式 MySQL binlog 存储系统 为自己搭建一个分布式 IM(即时通讯)系统 分布式系统的基石:深入浅出共识算法 [译] 伯克利开源多数据流实时分布式分析系统 Confluo,吞吐超 Kafka 4-10 倍 Ambry:LinkedIn 对象存储论文翻译 Go 分布式实时服务架构 自己写分布式配置中心(上):单机模式 唯品会分布式强一致日志存储系统 VDL 正式对外开源 浅谈分布式最终一致性 MIT 6....

August 21, 2022

mybatis

阅读准备参考:https://www.jianshu.com/p/e739afb8fe31 需要导入模块:需要将mybatis-parent模块导入。mybatis-parent模块链接 https://github.com/mybatis/parent 1.兵马未动,日志先行 org.apache.ibatis.logging org.apache.ibatis.logging.commons org.apache.ibatis.logging.jdbc org.apache.ibatis.logging.jdk14 org.apache.ibatis.logging.log4j org.apache.ibatis.logging.log4j2 org.apache.ibatis.logging.nologging org.apache.ibatis.logging.slf4j org.apache.ibatis.logging.stdout 对象适配器设计模式 设计模式可参考http://www.cnblogs.com/liuling/archive/2013/04/12/adapter.html 2.异常 org.apache.ibatis.exceptions 3.缓存 org.apache.ibatis.cache org.apache.ibatis.cache.decorators org.apache.ibatis.cache.impl 4.解析 org.apache.ibatis.parsing xml解析,${} 格式的字符串解析 源码分析可以参考http://www.cnblogs.com/sunzhenchao/p/3161093.html 5.类型处理器 org.apache.ibatis.type 实现java和jdbc中的类型之间转换 源码分析可以参考http://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html 6.IO org.apache.ibatis.io 通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类 7.反射 org.apache.ibatis.reflection org.apache.ibatis.reflection.factory org.apache.ibatis.reflection.invoker org.apache.ibatis.reflection.property org.apache.ibatis.reflection.wrapper 可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类 8.数据源 org.apache.ibatis.datasource org.apache.ibatis.datasource.jndi org.apache.ibatis.datasource.pooled org.apache.ibatis.datasource.unpooled 9.事务 org.apache.ibatis.transaction org.apache.ibatis.transaction.jdbc org.apache.ibatis.transaction.managed 10.会话 org.apache.ibatis.session org.apache.ibatis.session.defaults 11.jdbc单元测试工具 org.apache.ibatis.jdbc 12.构建 org.apache.ibatis.builder org.apache.ibatis.builder.annotation org.apache.ibatis.builder.xml 13.映射 org.apache.ibatis.mapping 14.脚本 org.apache.ibatis.scripting org.apache.ibatis.scripting.defaults org.apache.ibatis.scripting.xmltags 15.注解 org.apache.ibatis.annotations 16.绑定 org.apache.ibatis.binding 17.执行器 org.apache.ibatis.executor org....

July 6, 2022

雪花算法

1. 历史 snowflake是由 twitter 开源的分布式 id 生成算法,采 用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 bits 作为序列号。 小插曲:世界上没有两片相同的雪花,所以使用雪花来表示唯一 2. 算法内容 1:第一位不使用:为什么这里第一位不使用,因为对于long类型,如果第一位是1 则说明是负数 2~42:表示时间戳,最多可以表示2^41-1次方的数值,可以是毫秒级。 43~52:表示工作机器ID,最多支持2^10机器,也就是1024的机器。可以自己定义前几位为机房ID。 53~64:表示自增ID,同一毫秒如果超过2^12次方的增长量,应该算非常大的了 3. 代码实现 public class SnowFlake { private final long workerId; private final long datacenterId; private long sequence; public SnowFlake(long workerId, long datacenterId, long sequence) { // sanity check for workerId // 这儿不就检查了一下,要求就是你传递进来的机房id和机器id不能超过32,不能小于0 // 这个是二进制运算,就是 5 bit最多只能有31个数字,也就是说机器id最多只能是32以内 // 这个是一个意思,就是 5 bit最多只能有31个数字,机房id最多只能是32以内 long maxWorkerId = ~(-1L << workerIdBits); if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException( String....

June 29, 2022

图片服务整体架构

1.背景 面向海外用户设计图片类app的后端架构。 2. 目标 考虑跨地区访问图片列表。 图片容灾和备份服务。 用户访问突增的解决方案。 海外服务政策相关注意事项。 3. 方案(图片) ps:这里先统一考虑图片的设计过程,图片解决后,再考虑业务后台过程 3.1 自研 方案设计 分布式文件系统:采用开源系统进行搭建分布式文件系统 文件系统服务:可以新增图片时可以生成索引返回给业务,当业务只需要根据索引,就能查询到对应的文件内容 业务层:上传服务主要负责图片的上传、而列表服务则是需要根据请求,获取列表及数据 接入层:接收用户的请求,把请求代理到业务上 这么设计,可以实现一个图片类的应用。在实际中会有什么问题? 不同区域的用户,体验不一样,用户离部署的节点越近,用户体验更好 因为根据之前的经验,地域对于网络的延迟影响很大。大致从ping上就能体现 地区1 地区2 ping时间 上海 广州 30ms 上海 上海 10ms 上海 美国 100ms 从终端的成功率上看,由于网络上的丢包、延迟,成功率会低很多,特别是图片(目前图片1~3M都是比较正常的),这么大的图片,在过程中,发生丢包、延迟,失败率可想而知,会特别的高。 这种场景,我们可以考虑下,访问国外某些网站的时候,经常是失败,体验非常差 改进点 那么需要怎么改进呢? 比较容易想到的就是,既然是距离远,那么直接在对应的地方部署一个服务,不就行了么? 这样各地的用户,通过dns的调度,访问对应的接入层,接入层只访问当前区域的服务(同一个区域),这样就减少了网络上的问题。解决了用户体验。但是,好像跟需求不是太耦合。。。需求是跨区域访问。 那么要怎么样实现跨区域访问呢? 从图上可以看出来,如果底层数据实现了数据同步,那么是不是就可以了? 比如亚洲用户发布内容,那么我们把数据同步给其他集群,这样其他集群就可以访问到亚洲用户的信息了 要怎么实现同步呢?目前了解到**FastDFS**可以实现分布式任务系统的,他是采用binlog进行同步,在log中有个标志位用户记录该条记录是C: 增加 D: 删除 A: 添加 M: 修改 U: 更新整个文件 T: 截断文件 等,当亚洲区域进行添加时,会发送日志给美洲、欧洲,他们也会根据binlog的日志添加,这里需要注意:同步数据采用的标识与写入的是不一样的,采用小写,目的是为了区别是否需要同步给其他集群。 这里还没有对FastDFS跨区同步进行测试过,还不确定具体的延迟能够到达多少(有待验证)。 理论上,上面的方案是可以实现的,那么我们会有什么问题呢? 所有图片数据,都存在多份,每个数据都需要进行公网的同步。 文件传入与数据传输需要保证一致,不能有数据了,没有文件 那么我们有没有其他方案进行呢?下面我们来看下 对于图片,可以采用CDN加速。 对于API接口了解到市面上,有一种产品,叫做“全站加速”或者“动态加速”,也就是cdn不进行缓存,直接访问,这样的话,我们可以直接让用户访问,这样的话,所有数据都访问了中心区域的数据,通过“动态加速”把用户和源进行连接,核心是增加了数据传输的稳定性,降低失败率。 这种方式存在什么问题: 数据量问题: a) 扩容问题:这个也不算特别问题,是项目一般都会遇到 b) 冷热数据:如果统一的采用一套文件系统,那么会导致数据积累越来越多,文件系统会不停的扩大 当然还有其他的一些需要考虑的点,比如高请求量下“文件内容缓存”、容灾备份等还没有详细讲 3.2 外部功能 既然自研中,考虑了外部功能,那么市面上是否有外部的功能,可以实现全球图片访问问题呢?...

June 9, 2022

Java线程

线程 概念 Java线程是什么 Java的线程,是运行在JVM的程序上的基本执行单元, Java针对线程抽象出Thread对象的概念。 Java线程分类 Thread分为守护线程和非守护线程,当JVM启动时,伴随一个非守护线程的运行,我们称之为主线程/main函数,当JVM所有的非守护线程都销毁时,JVM实例也会销毁; Java线程生命周期 Java线程包含6个状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED 多线程优缺点 JVM支持多线程,正确使用多线程能大大提高程序的服务能力,同时也引入程序的复杂度和线程安全问题(不正确使用)。 状态Thread.State 一个线程在指定的时刻上,只能存在一个状态;JVM的线程状态和操作系统的线程状态不是一一对应的。了解线程状态可用于分析线程问题/监控,不建议通过判断线程状态来进行逻辑处理 NEW (新建) 一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.) 尚未启动的线程处于这一状态,即尚未调用start() Theard t = new Theard(); RUNNABLE (可运行) 一个正在 Java 虚拟机中执行的线程处于这一状态。(A thread executing in the Java virtual machine is in this state.) JVM中可执行的线程处于这一状态 Theard t = new Theard(); t.start(); BLOCKED (阻塞) 一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state....

June 2, 2022