《技术体系》读书笔记
2020-08-05 14:29:51 0 举报
AI智能生成
高级程序员《技术体系》
作者其他创作
大纲/内容
大数据
Hadoop<br>
框架<br>
Hadoopt体系<br>
HDFS
基本概念<br>
命令行操作<br>
集群结构<br>
namenode原理<br>
namenode高可用<br>
数据读写过程<br>
读过程<br>
写过程
文件格式<br>
存储效率<br>
常见问题和解决方案<br>
MapReduce<br>
原理<br>
编程模型<br>
Java API<br>
执行机制<br>
案例<br>
参数调优<br>
YARN<br>
基本架构<br>
资源调度器<br>
调度算法<br>
资源调度过程<br>
任务提交<br>
资源分配
Hadoop3.0新特性<br>
纠删码存储<br>
intra-datanode balancer<br>
YARN timelien service<br>
新容器资源类型<br>
任务本地化<br>
shell脚本更新<br>
Hadoop核心源码
HDFS<br>
DistributedFileSystem和DFSClient实现<br>
HDFS打开文件流程<br>
HDFS创建文件流程<br>
HDFS写文件流程<br>
Hadoop的容错机制<br>
Fslmage与Edits<br>
NameNode启动过程<br>
RPC机制
MapReduce<br>
数据流和工作流<br>
Mapper的输入<br>
Mapper的输出缓冲区MapOutputBuffer<br>
Collector的MapOutBuffer<br>
环形缓冲区<br>
MapOutputBuffer输出<br>
Map终结和Spill文件合并<br>
Reduce阶段的输入和输出<br>
YARN<br>
Job.submit开始<br>
YARNRunner和ResourceMGrDlegate<br>
NM节点心跳和容器周转<br>
Container的分配<br>
NodeManeger与任务投递<br>
MRAppMaster与作业投递
离线批处理:Hive
Hive总体架构<br>
DDL/DML<br>
Hive视图<br>
Hive函数<br>
分区,分桶,抽样<br>
数据加载方式<br>
Access Log<br>
Hive优化<br>
Hive on spark<br>
数据采集:flume<br>
作用与角色<br>
架构<br>
核心组件<br>
源码分析<br>
常用方式<br>
用户行为分析
知识背景<br>
用户行为数据采集<br>
pv,uv功能实现<br>
页面停留时间,流失率<br>
留存率,转化漏斗<br>
分析计算结果回流<br>
Spark<br>
语言<br>
Scala<br>
变量声明<br>
方法和函数<br>
循环<br>
集合<br>
类,继承,单例<br>
函数式编程<br>
概要<br>
源码<br>
Spark SQL<br>
Spark Sreaming<br>
flink<br>
应用场景<br>
实时数仓<br>
实时监控<br>
实时报表<br>
流数据分析<br>
组件<br>
JobManager<br>
接受application,包含StreamGraph、JobGraph和JAR<br>
ResourceManager<br>
一般是Yarn,当TM有空闲的slot就会告诉JM,没有足够的slot也会启动新的TM。kill掉长时间空闲的TM<br>
TaskManager<br>
会跑多个线程的task、数据缓存与交换<br>
Dispatcher<br>
提供REST接口来接收client的application提交,它负责启动JM和提交application,同时运行Web UI<br>
模式<br>
Session模式<br>
预先启动好AM和TM,每提交一个job就启动一个Job Manager并向Flink的RM申请资源,不够的话,Flink的RM向YARN的RM申请资源。适合规模小,运行时间短的作业<br>
1、Submit App<br>
2、Launch AM<br>
3、Submit Job<br>
4、Start JM<br>
5、Request Slot<br>
6、Request Resource<br>
7、Start TM<br>
8、Request Slot<br>
9、Offer Slot<br>
10、Submit Task<br>
Job模式<br>
每一个job都重新启动一个Flink集群,完成后结束Flink,且只有一个Job Manager。资源按需申请,适合大作业。<br>
Framework模式<br>
Flink作业为JAR,并被提交到Dispatcher or JM or YARN<br>
Library模式<br>
Flink作业为application-specific container image,如Docker image,适合微服务<br>
编程模型<br>
数据流程<br>
Source Operator<br>
Transformation Operator<br>
Sink Operator<br>
并行处理<br>
数据交换策略<br>
转发<br>
广播<br>
基于键<br>
随机<br>
时间语义<br>
事件时间<br>
事件创建时间<br>
接入时间
source进入flink的时间<br>
处理时间<br>
运算的时间<br>
窗口模型<br>
time window<br>
滚动窗口<br>
窗口大小
滑动窗口<br>
窗口大小<br>
滑动步长<br>
会话窗口<br>
全局窗口<br>
count window<br>
滚动count<br>
滑动count<br>
window join<br>
滚动join<br>
滑动join<br>
间隔join<br>
水位线<br>
定义<br>
1、算子根据时间水位线来触发相应的计算和处理<br>
2、超过水位线的窗口,不会执行<br>
场景<br>
处理l乱序<br>
处理延时<br>
类型<br>
定期水位线<br>
标点水位线<br>
state状态
定义<br>
就是一个内存中数据/存储结构,task独享变量<br>
应用场景<br>
下一个流需要使用,上一个流处理的结果时(上一个流已经消亡了),可以把结果存放在state中<br>
状态类型<br>
ValueState<br>
update()<br>
value()<br>
ListState<br>
add()<br>
addAll()<br>
get()<br>
ReduceingState<br>
update()<br>
get()<br>
AggregatingState<br>
add()<br>
get()<br>
MapState<br>
put()<br>
putAll()<br>
get()<br>
容错<br>
checkpoint<br>
定义<br>
在某一时刻,将flink job做一个快照,存储到state backend中(如hdfs)<br>
应用场景<br>
静态计算作业图<br>
有状态作业图<br>
非常大的状态,长窗口<br>
需要HA的场景<br>
容错机制<br>
固定间隔延迟重启<br>
故障率重启<br>
不重启<br>
后备重启<br>
flink streaming sql<br>
流程<br>
1、输入流<br>
2、动态表
3、执行查询sql<br>
1、将sql解析成逻辑树<br>
2、结合catalog验证sql语法<br>
3、将逻辑树转换成Logical Plan<br>
4、生成optimized Logical Plan<br>
5、生成Flink Physical Plan<br>
6、生成Flink Execution Plan<br>
4、sql查询结果表<br>
5、输出流<br>
函数<br>
聚合<br>
group By<br>
group By window<br>
distinct<br>
having<br>
合并<br>
union<br>
unionAll<br>
intersect/exception<br>
in<br>
连表<br>
inner join
outer join<br>
window join<br>
异步IO<br>
AsyncFunction<br>
callback<br>
DataStream异步<br>
UDX<br>
UDF<br>
UDTF<br>
UDAF<br>
数据仓库
维度建模<br>
选择业务过程<br>
声明粒度<br>
确认维度<br>
结构<br>
维度ID<br>
描述<br>
类型<br>
退化维度<br>
非规范化扁平维度<br>
多层次维度<br>
日历日期维度<br>
扮演角色的维度<br>
杂项维度<br>
雪花维度<br>
支架维度<br>
一致性维度<br>
缩减维度<br>
缓慢变化维<br>
拉链表<br>
适用场景<br>
确认事实<br>
结构<br>
维度ID<br>
常规描述<br>
度量值
类型<br>
一致性事实<br>
事务事实<br>
周期快照事实<br>
快照表<br>
适用场景<br>
累积快照事实<br>
无事实<br>
聚集事实<br>
合并事实<br>
模型评审与验证<br>
数据加工<br>
分层
ods<br>
dwd<br>
dws<br>
dm<br>
数据质量<br>
如何快速展示数据情况<br>
1、衡量质量的指标可视化界面<br>
2、校验数据质量的业务规则的可视化界面<br>
元数据管理<br>
任务调度<br>
AirFlow<br>
搜索/推荐<br>
算法<br>
热销排行<br>
基于人口属性<br>
基于内容<br>
协同过滤<br>
关联规则<br>
逻辑回归<br>
架构<br>
数据收集<br>
数据加工<br>
支持多种算法<br>
支持多种业务规则<br>
支持不同的算法测试策略
高可用
可配置<br>
计算结果落库<br>
推荐查询<br>
机器学习<br>
用户画像<br>
定义<br>
用户的各种属性<br>
应用场景<br>
业务精细化运营-圈人<br>
数据分析挖掘<br>
精准营销<br>
个性化推荐<br>
选人平台<br>
模块<br>
标签定义模块<br>
标签开发模块<br>
标签存储模块<br>
标签作业ETL调度模块<br>
选人UI模块<br>
活动效果跟踪和评估<br>
主题集市<br>
用户属性<br>
用户爱好<br>
购买历史<br>
用户行为<br>
群体偏好<br>
风险特征<br>
数据流<br>
1、数仓集市<br>
2、ES标签库<br>
3、选人平台<br>
4、人库<br>
5、营销工具<br>
系统交互<br>
1、DB-读写DAG状态<br>
2、ES-标签ETL<br>
3、选人平台-人群明细查询<br>
4、选人平台-定时任务<br>
5、选人平台-定时写入结果库<br>
6、选人平台-通知营销工具<br>
7、营销工具-推送消息<br>
标签库设计<br>
标签维度<br>
用户标签维度<br>
用户自身特征<br>
性别<br>
年龄<br>
地域<br>
教育水平<br>
生日<br>
职业<br>
用户兴趣特征<br>
终端偏好<br>
喜欢浏览的产品类别<br>
喜欢购买的产品类别<br>
喜欢购买产品的投资周期<br>
风险偏好<br>
首次购买产品类型<br>
最近购买产品类型<br>
用户社交特征<br>
婚姻状态<br>
是否有子女<br>
微信账号<br>
微博账号<br>
是否好友推荐<br>
邮箱账号<br>
用户财富特征<br>
收入水平<br>
AUM<br>
已购商品类别<br>
总购买次数<br>
购买频率<br>
是否有车
是否有房<br>
累计充值金额<br>
累计充值次数<br>
投资经验
产品标签维度<br>
开放式基金<br>
P2P理财<br>
理财计划<br>
保险理财<br>
现金管理<br>
渠道标签维度<br>
搜索渠道<br>
网站导航渠道<br>
在线广告渠道<br>
标签类型<br>
统计类<br>
规则类<br>
挖掘类
Java
基础
设计原则
开闭原则<br>
依赖倒置原则
单一职责原则
接口隔离原则<br>
迪米特法则<br>
里氏替换原则
合成复用原则
设计模式
创建型模式
简单工厂模式
工厂方法模式
抽象工厂
建造者模式<br>
单例模式<br>
原型模式
结构型模式<br>
享元模式
组合模式<br>
桥接模式<br>
适配器模式<br>
门面模式<br>
装饰器模式<br>
代理模式
行为型模式
策略模式
模板方法模式<br>
迭代器模式<br>
委派模式<br>
观察者模式<br>
责任链模式<br>
命令模式<br>
备忘录模式<br>
状态模式<br>
访问者模式<br>
中介者模式<br>
解释器模式
集合<br>
List
ArrayList<br>
LinkedList
Map<br>
HashMap
ConcurrentHashMap
Set<br>
HashSet<br>
TreeSet
JVM
运行时数据区
程序计数器
虚拟机栈<br>
本地方法栈<br>
堆
新生代<br>
老年代
方法区
垃圾回收器<br>
Serial <br>
ParNew<br>
Parallel Scavenge<br>
Serial Old<br>
Parallel Old<br>
CMS<br>
G1
GC日志<br>
GC发生的时间
垃圾收集的停顿类型<br>
GC发生的区域<br>
GC前该内存区域已使用容量 -> GC后该内存区域已使用容量<br>
GC所占用的时间<br>
用户消耗的CPU时间<br>
内存态消耗的CPU时间<br>
操作从开始到结束所经过的时间
dump文件<br>
大对象分析
多线程<br>
Thread
currentThread()<br>
join()<br>
yield()<br>
isAlive()<br>
sleep()<br>
getId()<br>
同步<br>
Synchronized<br>
volatile<br>
AbstractQueuedSynchronizer<br>
工具类<br>
CountDownLatch/CyclicBarrier<br>
Threadlocal<br>
Semophore<br>
Exchanger
线程池<br>
阻塞队列
LinkedBlockingQueue
ArrayBlockingQueue<br>
ThreadPoolExecutor <br>
corePoolSize<br>
maximumPoolSize<br>
keepAliveTime<br>
unit<br>
workQueue<br>
threadFactory
数据结构<br>
枚举<br>
位集合<br>
向量<br>
栈<br>
字典<br>
哈希表<br>
属性
算法<br>
算法复杂度
贪心算法<br>
分治算法<br>
动态规划算法<br>
回溯法<br>
分支定界法<br>
字符串匹配算法<br>
排序算法
常用框架
Spring
核心包<br>
spring-core
构建应用的核心,主要提供了依赖注入的特性
spring-context<br>
顶层接口ApplicationContext,主要存放各种配置的信息(properties文件,yml文件等)
spring-beans<br>
顶层接口BeanFactory,主要存放bean的元数据beanDefinitions和造bean
spring-web<br>
WebApplicationContext接口,主要存放web容器,servlet相关配置信息<br>
spring-webmvc<br>
DispatcherServlet,主要是分发请求,组装返回,model,view,controller
初始化过程
入口:ContextLoaderListener
1、prepareRefresh()
2、obtainFreshBeanFactory()<br>
3、prepareBeanFactory(beanFactory)<br>
4、postProcessBeanFactory(beanFactory)<br>
5、invokeBeanFactoryPostProcessors(beanFactory)<br>
6、registerBeanPostProcessors(beanFactory)<br>
7、initMessageSource()<br>
8、initApplicationEventMulticaster()<br>
9、onRefresh()<br>
10、registerListeners()<br>
11、finishBeanFactoryInitialization(beanFactory)<br>
12、finishRefresh()
Spring MVC
初始化过程<br>
入口:DispatcherServlet<br>
1、initMultipartResolver(context)
2、initLocaleResolver(context)<br>
3、initThemeResolver(context)<br>
4、initHandlerMappings(context)<br>
5、initHandlerAdapters(context)<br>
6、initHandlerExceptionResolvers(context)<br>
7、initRequestToViewNameTranslator(context)<br>
8、initViewResolvers(context)<br>
9、initFlashMapManager(context)
运行过程<br>
入口:DispatcherServlet<br>
1、getHandler(processedRequest)
2、getHandlerAdapter(mappedHandler.getHandler())<br>
3、ha.handle(processedRequest, response, mappedHandler.getHandler())<br>
4、processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
MyBatis<br>
初始化过程
1、调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法
2、SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象<br>
3、SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法<br>
4、XMLConfigBuilder 对象返回 Configuration 对象<br>
5、SqlSessionFactoryBuilder 根据 Configuration 对象创建一个DefaultSessionFactory 对象<br>
6、SqlSessionFactoryBuilder 返回 DefaultSessionFactory 对象给 Client
运行过程<br>
查询<br>
resultMap<br>
一对一级联查询,association<br>
一对多级联查询,collection<br>
一级缓存,SqlSession<br>
参数和SQL完全一样,SQL执行一次<br>
传入的statementId<br>
查询时要求的结果集中的结果范围<br>
Sql语句字符串<br>
参数值
二级缓存,Mapper<br>
所有select语句将会被缓存<br>
所有insert、update和delete语句会刷新缓存
标签
foreach<br>
choose<br>
when<br>
otherwise<br>
if<br>
trim<br>
where<br>
set<br>
bind<br>
用于模糊查询<bind name="paran_uname" value="'%' + uname + '%'"/>
常用组件
Redis
数据结构<br>
String<br>
Hash<br>
链表<br>
Set<br>
zset
持久化<br>
RDB<br>
概念<br>
快照全量备份<br>
触发方式<br>
save<br>
bgsave<br>
自动触发<br>
AOF<br>
概念<br>
将写命令都通过write函数追加到文件中<br>
触发方式
always<br>
同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好<br>
everysec<br>
异步操作,每秒记录 如果一秒内宕机,有数据丢失
no<br>
从不同步
高可用<br>
主从<br>
原理<br>
初始化<br>
同步一份RDB给从节点<br>
写过程<br>
master发送写命令给slave<br>
断点续传<br>
master和slave内部都会维护一个backlog文件,backlog里面保存一个offset数据,比较offset来续传
优点<br>
缺点
哨兵<br>
原理<br>
sdown和odown转换机制<br>
哨兵集群的自动发现机制
slave配置的自动纠正<br>
slave->master选举算法<br>
跟master断开连接的时长<br>
slave优先级-高<br>
复制offset-多<br>
run id-小
quorum和majority<br>
configuration epoch<br>
configuraiton传播
优点<br>
缺点
Cluster<br>
原理<br>
redis集群固定持有16384个hash slot(虚拟节点),K/V存储时,对K的取CRC16%16384,找到对应的hash slot<br>
从节点选举<br>
N/2 + 1
优点<br>
缺点<br>
常规问题<br>
缓存<br>
缓存穿透<br>
缓存击穿<br>
缓存雪崩<br>
缓存数据与数据库数据一致性
session共享<br>
将产生的session放入redis,下次请求根据session ID获取session
mongoDB
基本概念<br>
database<br>
collection<br>
document<br>
field<br>
index<br>
createIndex<br>
getIndexes<br>
totalIndexSize<br>
dropIndexes<br>
dropIndex
primary key
读过程<br>
1、client
2、route server<br>
3、config server<br>
4、shard server<br>
5、route server<br>
6、client
写过程
1、client<br>
2、route server<br>
3、config server<br>
4、shard server
高可用<br>
主从方式<br>
双机双工方式<br>
集群工作方式
mysql
基本概念
引擎<br>
InnoDB<br>
聚集
MyISAM<br>
非聚集
索引<br>
B-Tree
B+Tree<br>
最左前缀原理<br>
失效
流程<br>
1、客户端<br>
2、查询缓存<br>
3、语法解析<br>
4、查询优化<br>
5、执行查询<br>
6、缓存结果<br>
7、返回客户端
分库分表<br>
垂直<br>
优点<br>
缺点<br>
水平<br>
优点<br>
缺点
问题<br>
事务一致性<br>
跨节点关联查询 join<br>
跨节点分页、排序、函数<br>
全局主键避重<br>
数据迁移、扩容
高可用<br>
Master High Availability<br>
MySQL Group Replication<br>
组复制<br>
Percona XtraDB Cluster
nginx<br>
模块<br>
核心模块<br>
处理器模块<br>
过滤器模块<br>
代理类模块<br>
web 服务<br>
负载均衡<br>
随机算法<br>
轮询及加权轮询<br>
最小连接及加权最小连接<br>
哈希算法<br>
IP地址散列<br>
URL散列
web cache<br>
限制IP,限制连接数
tomcat<br>
启动过程<br>
1、入口类,org.apache.catalina.startup.Bootstrap#main,初始化类加载器,反射实例化Catalina<br>
2、执行Catalina的start方法,加载server.xml配置、初始化Server,开启服务、初始化并开启一系列组件、子容器<br>
3、解析server.xml,创建Context后解析web.xml(读取顺序:context-param->listener->filter->servlet)<br>
4、listener中的核心是ServletContextListener(spring初始化入口),ServletRequestListener(请求入口)<br>
5、servlet的核心是DispatcherServlet(springMVC前端控制器)
运行过程<br>
1、客户端发送请求http://localhost:8080/wsota/wsota_index.jsp<br>
2、请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得<br>
3、 Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应<br>
4、Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host<br>
5、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)<br>
6、localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context<br>
7、Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)<br>
8、path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet<br>
9、 Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类<br>
10、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法<br>
11、Context把执行完了之后的HttpServletResponse对象返回给Host<br>
12、Host把HttpServletResponse对象返回给Engine<br>
13、Engine把HttpServletResponse对象返回给Connector<br>
14、Connector把HttpServletResponse对象返回给客户browser
MQ
ActiveMQ<br>
写过程<br>
读过程<br>
高可用
RabbitMQ<br>
写过程<br>
读过程<br>
高可用
RocketMQ<br>
写过程<br>
读过程<br>
高可用
微服务
理论<br>
大型分布式架构演进过程<br>
分布式架构需要常规考虑因素<br>
CDN加速静态文件<br>
分布式存储<br>
分布式搜索引擎<br>
应用发布与监控<br>
容灾及机房规划<br>
系统动态扩容
分布式架构设计原则
SOA架构和微服务架构
领域驱动和业务驱动<br>
CAP,BASE<br>
C(一致性)<br>
A(可用性)<br>
P(分区容错性)
高可用设计<br>
可伸缩设计<br>
高性能设计
框架<br>
Spring Boot
@SpringBootApplication<br>
@Configuration<br>
@ComponentScan<br>
默认扫描注解所在类的package<br>
@EnableAutoConfiguration<br>
开启自动配置
启动过程
1、创建SpringApplication对象实例<br>
扫描spring.factories中的ApplicationContextInitializer和ApplicationListener
2、执行run方法,遍历执行SpringApplicationRunListener的started()方法<br>
SpringApplicationRunListener用于监听启动过程中的各个节点
3、创建并配置Environment<br>
4、遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法<br>
5、如果SpringApplication的showBanner属性被设置为true,则打印banner<br>
6、创建ApplicationContext,将Environment设置给创建好的ApplicationContext<br>
7、遍历调用ApplicationContextInitializer的initialize(applicationContext)方法<br>
8、遍历调用所有SpringApplicationRunListener的contextPrepared()方法<br>
9、将@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到ApplicationContext<br>
扫描spring.factories中的EnableAutoConfiguration,装配组件
10、遍历调用所有SpringApplicationRunListener的contextLoaded()方法<br>
11、调用ApplicationContext的refresh()方法,完成IOC容器和依赖注入<br>
12、遍历执行CommandLineRunner<br>
13、遍历执行SpringApplicationRunListener的finished()方法
Spring Cloud
Eureka<br>
Eureka Client<br>
负责将这个服务的信息注册到Eureka Server中<br>
默认30秒心跳<br>
Eureka Server<br>
注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号<br>
刷新列表频率<br>
监测心跳频率,默认90秒<br>
A(可用性)和P(分区容错性)<br>
Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务<br>
Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用) <br>
当网络稳定时,当前实例新的注册信息会被同步到其它节点中
Feign
动态代理<br>
实现接口,并根据@FeignClient等注解构造请求
Ribbon<br>
默认轮询算法<br>
客户端负载均衡<br>
维护Sever列表的数量(新增、更新、删除等)<br>
维护Server列表的状态(状态更新)<br>
当请求Server实例时,能否返回最合适的Server实例
使用方法<br>
引入ribbon的jar<br>
在RestTemplat加入LoanBalance注释即可
Hystrix<br>
隔离<br>
线程池<br>
熔断<br>
直接返回,不走网络请求超时,没有补偿措施<br>
降级<br>
直接返回的同时,有补偿措施,比如消息队列,调用记录等<br>
使用方法<br>
消费端启动类上加@EnableDiscoveryClient,@EnableHystrix,@EnableHystrixDashboard
Zuul<br>
能力<br>
验证与安全保障<br>
审查与监控<br>
动态路由<br>
压力测试<br>
负载分配<br>
静态响应处理<br>
多区域弹性<br>
过滤器<br>
PRE<br>
这种过滤器在请求被路由之前调用<br>
ROUTING<br>
这种过滤器将请求路由到微服务<br>
POST<br>
这种过滤器在路由到微服务以后执行<br>
ERROR<br>
在其他阶段发生错误时执行该过滤器<br>
特殊过滤器<br>
StaticResponseFilter<br>
允许从Zuul本身生成响应,而不是将请求转发到源<br>
SurgicalDebugFilter<br>
允许将特定请求路由到分隔的调试集群或主机
自定义过滤器
热部署<br>
FilterScriptManagerServlet<br>
Filter源码文件放在zuul 服务特定的目录, zuul server会定期扫描目录下的文件的变化,动态的读取\编译\运行这些filter
zipkin<br>
链路追踪<br>
耗性能,有问题调试的时候再打开<br>
config<br>
配置中心<br>
利用消息队列建立一个spring cloud bus,由git存储配置文件,利用bus总线动态更新配置文件信息
分布式事务<br>
二阶段提交协议<br>
最终一致性<br>
消息队列<br>
幂等性<br>
本身有幂等性<br>
保证顺序<br>
不具备幂等性<br>
记录执行结果,执行过就不执行<br>
事务补偿机制<br>
TCC模式<br>
Try<br>
完成所有业务检查 预留必须业务资源<br>
Confirm<br>
真正执行业务<br>
操作具有幂等性<br>
Cancel<br>
释放Try阶段预留的业务资源<br>
操作具有幂等性
周期性对账<br>
Dubbo<br>
介绍<br>
适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况<br>
原理<br>
初始化<br>
服务提供<br>
服务消费<br>
组件
ElasticSearch<br>
介绍<br>
基本概念<br>
索引
类型<br>
文档<br>
字段<br>
集群<br>
节点<br>
主节点
数据节点<br>
协调节点<br>
分片<br>
主分片<br>
副本分片<br>
写过程<br>
1、大概<br>
ES的任意节点都可以作为协调节点(coordinating node)接受请求,当协调节点接受到请求后进行一系列处理,然后通过_routing字段找到对应的primary shard,并将请求转发给primary shard, primary shard完成写入后,将写入并发发送给各replica, raplica执行写入操作后返回给primary shard, primary shard再将请求返回给协调节点<br>
2、coordinating节点<br>
1、ingest pipeline:查看该请求是否符合某个ingest pipeline的pattern, 如果符合则执行pipeline中的逻辑,一般是对文档进行各种预处理,如格式调整,增加字段等。如果当前节点没有ingest角色,则需要将请求转发给有ingest角色的节点执行<br>
2、自动创建索引:判断索引是否存在,如果开启了自动创建则自动创建,否则报错<br>
3、设置routing:获取请求URL或mapping中的_routing,如果没有则使用_id, 如果没有指定_id则ES会自动生成一个全局唯一ID。该_routing字段用于决定文档分配在索引的哪个shard上<br>
4、构建BulkShardRequest:由于Bulk Request中包含多种(Index/Update/Delete)请求,这些请求分别需要到不同的shard上执行,因此协调节点,会将请求按照shard分开,同一个shard上的请求聚合到一起,构建BulkShardRequest<br>
5、将请求发送给primary shard:因为当前执行的是写操作,因此只能在primary上完成,所以需要把请求路由到primary shard所在节点<br>
6、等待primary shard返回
3、primary shard<br>
1、判断操作类型:遍历bulk请求中的各子请求,根据不同的操作类型跳转到不同的处理逻辑
2、将update操作转换为Index和Delete操作:获取文档的当前内容,与update内容合并生成新文档,然后将update请求转换成index请求,此处文档设置一个version v1<br>
3、Parse Doc:解析文档的各字段,并添加如_uid等ES相关的一些系统字段<br>
4、更新mapping:对于新增字段会根据dynamic mapping或dynamic template生成对应的mapping,如果mapping中有dynamic mapping相关设置则按设置处理,如忽略或抛出异常<br>
5、获取sequence Id和Version:从SequcenceNumberService获取一个sequenceID和Version。SequcenID用于初始化LocalCheckPoint, verion是根据当前Versoin+1用于防止并发写导致数据不一致<br>
6、写入lucene:这一步开始会对文档uid加锁,然后判断uid对应的version v2和之前update转换时的versoin v1是否一致,不一致则返回第二步重新执行。 如果version一致,如果同id的doc已经存在,则调用lucene的updateDocument接口,如果是新文档则调用lucene的addDoucument. 这里有个问题,如何保证Delete-Then-Add的原子性,ES是通过在Delete之前会加上已refresh锁,禁止被refresh,只有等待Add完成后释放了Refresh Lock, 这样就保证了这个操作的原子性<br>
7、写入translog:写入Lucene的Segment后,会以key value的形式写Translog, Key是Id, Value是Doc的内容。当查询的时候,如果请求的是GetDocById则可以直接根据_id从translog中获取。满足nosql场景的实时性<br>
8、重构bulk request:因为primary shard已经将update操作转换为index操作或delete操作,因此要对之前的bulkrequest进行调整,只包含index或delete操作,不需要再进行update的处理操作<br>
9、flush translog:默认情况下,translog要在此处落盘完成,如果对可靠性要求不高,可以设置translog异步,那么translog的fsync将会异步执行,但是落盘前的数据有丢失风险<br>
10、发送请求给replicas:将构造好的bulkrequest并发发送给各replicas,等待replica返回,这里需要等待所有的replicas返回,响应请求给协调节点。如果某个shard执行失败,则primary会给master发请求remove该shard。这里会同时把sequenceID, primaryTerm, GlobalCheckPoint等传递给replica<br>
11、等待replica响应:当所有的replica返回请求时,更细primary shard的LocalCheckPoint<br>
4、replica shard<br>
1、判断操作类型:replica收到的写如请求只会有add和delete,因update在primary shard上已经转换为add或delete了。根据不同的操作类型执行对应的操作
2、Parse Doc<br>
3、更新mapping<br>
4、获取sequenceId和Version:直接使用primary shard发送过来的请求中的内容即可<br>
5、写入lucene<br>
6、write Translog<br>
7、Flush translog
读过程<br>
1、客户端发送请求到任意一个node,成为coordinate node<br>
2、coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡<br>
3、query phase:每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果<br>
4、fetch phase:接着由协调节点,根据doc id去各个节点上拉取实际的document数据,最终返回给客户端<br>
Zookeeper<br>
结构<br>
文件系统<br>
通知机制<br>
作用<br>
命名服务<br>
配置管理<br>
集群管理<br>
是否有机器退出和加入、选举master<br>
分布式锁<br>
队列管理
原理<br>
选主流程<br>
paxos算法<br>
basic paxos<br>
1、选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server<br>
2、选举线程首先向所有Server发起一次询问(包括自己)<br>
3、选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中<br>
4、收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server<br>
5、线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来
fast paxos<br>
某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader
同步流程<br>
1、leader等待server连接<br>
2、Follower连接leader,将最大的zxid发送给leader<br>
3、Leader根据follower的zxid确定同步点<br>
4、完成同步后通知follower 已经成为uptodate状态<br>
5、Follower收到uptodate消息后,又可以重新接受client的请求进行服务了
工作流程<br>
Leader<br>
1、恢复数据<br>
2、维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型<br>
3、Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理<br>
Follower<br>
1、向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息)<br>
2、接收Leader消息并进行处理<br>
3、接收Client的请求,如果为写请求,发送给Leader进行投票<br>
4、返回Client结果
Netty<br>
Kafka<br>
适用场景<br>
要求高吞吐,对数据有序性要求不严格的场景<br>
作用<br>
解耦<br>
异步<br>
削峰<br>
通信模式<br>
点对点模式<br>
发布订阅模式<br>
组件
Broker<br>
Broker是kafka实例,每个服务器上有一个或多个kafka的实例<br>
Topic<br>
消息的主题,可以理解为消息的分类,kafka的数据就保存在topic<br>
Partition<br>
Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量<br>
segment<br>
.index文件<br>
索引文件<br>
.log文件<br>
存储message的地方<br>
offset<br>
在新的版本中消费者消费到的offset已经直接维护在kafk集群的__consumer_offsets这个topic中<br>
消息大小<br>
消息体<br>
.timeindex文件<br>
索引文件<br>
Replication<br>
每一个分区都有多个副本<br>
Message<br>
每一条发送的消息主体<br>
Consumer Group<br>
我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据<br>
建议消费者组的consumer的数量与partition的数量一致
Zookeeper<br>
kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性
发送数据<br>
1、从集群获取分区leader<br>
2、将消息发送给leader<br>
1、partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition<br>
2、 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition<br>
3、如果既没指定partition,又没有设置key,则会轮询选出一个partition<br>
3、leader将消息写入本地文件<br>
4、followers从leader pull消息<br>
5、followers将消息写入本地后向leader发送ACK<br>
6、leader收到所有副本的ACK后向producer发送ACK<br>
0<br>
0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高<br>
1<br>
1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功<br>
all<br>
all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低
消费数据<br>
1、先找到offset的368801message所在的segment文件(利用二分法查找),这里找到的就是在第二个segment文件<br>
2、打开找到的segment中的.index文件(也就是368796.index文件,该文件起始偏移量为368796+1,我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引<br>
3、根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message
Mycat
0 条评论
下一页