JAVA架构师
2019-12-11 11:06:39 8 举报
AI智能生成
java架构师必备技能
作者其他创作
大纲/内容
elasticsearch框架
查询类型
基于全文检索
基于词条检索
运维相关(DevOps)
运维工具
nginx
正向代理
反向代理
负载均衡
常用算法
round-robin的意思是循环轮询
least-connected算法的中文翻译是最少连接
ip-hash算法会根据请求的客户端IP地址来决定当前请求应该交给谁
weighted算法也就是权重算法
jenkins
自动化部署
gitlab
git代码管理
jumperserver
管理服务器,跳板机
docker
快速,一致地交付您的应用程序
响应式部署和扩展
在同一硬件上运行更多工作负载
k8s()
微服务部署
Blue/Green Deployment(蓝绿部署)
蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。
Rolling update(滚动发布)
滚动发布:一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。
灰度发布/金丝雀部署
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,而我们平常所说的金丝雀部署也就是灰度发布的一种方式。
红黑部署(Red-Black Deployment)
这是Netflix采用的部署手段,Netflix的主要基础设施是在AWS上,所以它利用AWS的特性,在部署新的版本时,通过AutoScaling Group用包含新版本应用的AMI的LaunchConfiguration创建新的服务器。测试不通过,找到问题原因后,直接干掉新生成的服务器以及Autoscaling Group就可以,测试通过,则将ELB指向新的服务器集群,然后销毁掉旧的服务器集群以及AutoScaling Group。
红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线
Linux
5种IO模型
阻塞I/O(blocking I/O)
非阻塞I/O (nonblocking I/O)
I/O复用(select 和poll) (I/O multiplexing)
信号驱动I/O (signal driven I/O (SIGIO))
异步I/O (asynchronous I/O (the POSIX aio_functions))
常用命令
yum -y install sysstat
iostat IO相关信息
netstat/ss
vmstat
可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)
lsof -i :8080
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TC和UDP等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的
find|pwd| kill -9 19979|grep |tar|head|tail|ls
top|free|du|df|ps|wget|tree|ssh|scp
chmod|chown
systemctl
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据
awk 是一种处理文本文件的语言,是一个强大的文本分析工具
性能测试
性能压测工具
loadrunner
jmeter
微服务
单片,SOA 和微服务架构有什么区别
分布式缓存
分布式锁
Redisson
事务
分布式事务
分布式事务框架
TCC协议
XA协议
事务的ACID特性
原子性(A)
一致性(C)
隔离性(I)
持久性(D)
框架
注册中心/配置中心
zookeeper
nacos
etcd
consul
网关
Kong
zuul
dubbo proxy
可靠性
Sentinel(阿里)
Resilience4j
Hystrix
授权
OAuth
网络
HTTP
http1.0
http1.1
缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
SPDY
http2.0
新的传输格式:2.0使用二进制格式,1.0依然使用基于文本格式
header压缩:由于1.X中header带有大量的信息,并且得重复传输,2.0使用encoder来减少需要传输的hearder大小
多路复用:连接共享,不同的request可以使用同一个连接传输(最后根据每个request上的id号组合成正常的请求)
服务端推送:同google的SPDUY(1.0的一种升级)一样
TCP
TCP连接次握手
分支主题
TCP关闭4次挥手
分支主题
TCP/IP模型分层
应用层
传输层
网络层
网络接口层
物理层
OSI模型分层
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
子主题 5
UDP
mysql
索引
B+树
数据库索引采用B+树的主要原因是:B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低
slow_query_log慢日志打开
mysql监控工具
LEPUS 天兔
navicat monitor2
子主题 1
子主题 2
子主题 3
常用集合
map
HashMap(非安全)
ConcurrentMap
TreeMap(非安全)
ConcurrentSkipListMap
LinkedHashMap(非安全)
hashTable
set
LinkedHashSet(非安全)
HashSet(非安全)
TreeSet(非安全)
ConcurrentSkipListSet
CopyOnWriteArraySet
list
ArrayList(非安全)
CopyOnWriteArrayList
LinkedList(非安全)
Queue
ArrayBlockingQueue
单锁
LinkedBlockingQueue
双锁
LinkedBlockingDeque
DelayQueue
PriorityBlockingQueue
LinkedTransferQueue
SynchronousQueue
ArrayDeque(非安全)
数据结构与设计模式
BF算法、KMP算法、BM算法
二叉树、B树、B+树、红黑树(是一种特殊的平衡二叉树)等
链表、队列、栈
七大设计原则
一、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责。
二、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规则。
三、依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。
四、接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。
五、迪米特法则【LOW OF DEMETER】:低耦合,高内聚。
六、开闭原则【OPEN CLOSE PRINCIPLE】:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
七、组合/聚合复用原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使用组合和聚合少使用继承的关系来达到复用的原则。
23种设计模式
行为型模式
类模式
解释器模式
模板方法模式
对象模式
迭代器模式
责任链模式
观察者模式
访问者模式
状态模式
中介者模式
备忘录模式
策略模式
命令模式
创建型模式
类模式
工厂方法模式
对象模式
单例模式
抽象工厂
建造者
原型
结构型模式
适配器模式(类,对象)
装饰者模式
代理模式
外观模式
桥接模式
组合模式
享元模式
JVM
Java 类加载过程
1. 加载
通过一个类的全限定名获取该类的二进制流
将该二进制流中的静态存储结构转化为方法去运行时数据结构
在内存中生成该类的 Class 对象,作为该类的数据访问入口
2. 验证
文件格式验证
验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型
元数据验证
对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等
字节码验证
是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等
符号引用验证
这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行
3. 准备
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中
4. 解析
该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后
5. 初始化
初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java 程序代码
6. 使用
7. 卸载
类加载器
Bootstrap ClassLoader
Extension ClassLoader
System ClassLoader
用户自定义
运行时数据区
堆
新生代
Eden区
From Survivor区
To Survivor区
老年代
虚拟机栈
本地变量表
操作数栈
动态链接
方法出口
本地方法栈
方法区 也称永久代(1.8后变成元数据信息metadata)
程序计数器
GC
垃圾回收器
Serial串行收集器-复制算法
ParNew收集器-复制算法
Parallel Scavenge 收集器-复制算法
Serial Old收集器-标记整理
Parallel Old 收集器-标记整理
CMS收集器-标记整理
G1收集器-标记整理
垃圾回收算法
标记清除
复制算法
标记整理
分代收集算法
判断一个对象是否存活有两种方法
1. 引用计数法
所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收。
引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象 A 引用对象 B,对象 B 又引用者对象 A,那么此时 A、B 对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法
2. 可达性算法(引用链法)
该算法的思想是:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到 GC Roots 没有任何引用链相连时,则说明此对象不可用
执行引擎
本地方法区
本地方法库
JVM工具
blog.gceasy.io
MemoryAnalyzer.exe(MAT)
jps、jstat、jmap、jinfo、jconsole
空间担保成功
JVM常用参数
happens-before规则
程序顺序规则:一个线程中的每个操作,happens-before于随后该线程中的任意后续操作
监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的获取
volatile变量规则:对一个volatile域的写,happens-before于对这个变量的读
传递性:如果A happens-before B,B happens-before C,那么A happens-before C
start规则:如果线程A执行线程B的start方法,那么线程A的ThreadB.start()happens-before于线程B的任意操作
join规则:如果线程A执行线程B的join方法,那么线程B的任意操作happens-before于线程A从TreadB.join()方法成功返回
多线程并发
线程
线程的生命周期
新建:new创建线程对象时
就绪:调用start()方法时
运行:调用run()方法时
阻塞: 多种原因可导致阻塞
死亡:多种原因
线程的创建方式
继承Thread类
覆写Runnable()接口
覆写Callable接口
通过线程池
线程间的通讯方式
synchronized加wait/notify方式
ReentrantLock加Condition方式
闭锁的方式
CountDownLatch
lock.countDown()
lock.await()
栅栏的方式
CyclicBarrier
barrier.await()
barrier.reset()
信号量的方式
Semaphore
acquire
release
管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信
线程的属性
ThreadGroup
stacksize(栈大小,有些平台不可用)
优先级
守护线程
join
interrupt
sleep
wait
可见性
volatile
线程封闭
同步类
executor框架
Executors
ThreadPoolExecutor
基于它的线程池
newFixThreadPool
newSingleThreadPool
newCacheThreadPool
newScThreadPool
ThreadPoolTaskExecutor spring封装的ThreadPoolExecutor
参数
corePoolSize
maximumPoolSize
keepAliveTime
workQueue
threadFactory
handler(任务拒绝策略)
DiscardPolicy: 默默丢弃无法处理的任务,不予任何处理
DiscardOldestPolicy: 丢弃队列中最老的任务, 尝试再次提交当前任务
(默认)AbortPolicy: 直接抛异常,阻止系统正常工作
CallerRunsPolicy: 将任务分给调用线程来执行,运行当前被丢弃的任务,这样做不会真的丢弃任务,但是提交的线程性能有可能急剧下降
ForkJoinPool(jdk7开始)
newWorkStealingPool(jdk8)
死锁的避免与诊断
锁
按主观性
悲观锁
synchronized
ReentrantLock
ReentrantReadWriteLock
StampedLock
乐观锁(无锁策略)
一般会使用版本号机制
CAS(compare and swap)算法(比较和替换)
按公平性分类
公平锁
非公平锁
锁级别
偏向锁
轻量级锁
重量级锁
其他
自旋锁
可重入锁
独享锁/共享锁
互斥锁/读写锁
分段锁
java内存模型
分支主题
JDK并发包
线程同步
CountDownLatch
CyclicBarrier
并发容器
CopyOnWriteArrayList
ConcurrentHashMap(分段锁)
ConcurrentSkipListMap(跳表)
CopyOnWriteArraySet
ConcurrentSkipListSet(跳表)
队列
单端阻塞(BlockingQueue)
Array~、Linked~、Sychronized~、LinkedTransfer~、Priority~、Delay~
双端阻塞(BlockingDeque)
Linked~
LinkedBlockingQueue
void put(E e): 在队尾插入元素,方法在队列满的时候会阻塞直到有队列成员被消费
boolean offer(E e): 在队尾插入元素,方法在队列满的时候不会阻塞,直接返回 false
E take(): 取出并删除队列中的首元素,如果队列为空,会阻塞,直到有队列成员被放进来
E poll(): 取出并删除队列中的首元素,如果队列为空,则返回 null,不进行阻塞
E peek(): 取出第一个元素但是不删除它,没有就返回 null
作者:专职跑龙套
链接:https://www.jianshu.com/p/1a49293294aa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
单端非阻塞(Queue)
ConcurrentLinked~
ConcurrentLinkedQueue
ConcurrentLinkedQueue 是 Queue 的一个安全实现。Queue 中元素按 FIFO 原则进行排序。采用 CAS操作,来保证元素的一致性。
boolean offer(E e): 在队尾插入元素,不进行阻塞
E poll(): 取出并删除队列中的首元素,不进行阻塞
E peek(): 取出第一个元素但是不删除它,不进行阻塞
作者:专职跑龙套
链接:https://www.jianshu.com/p/1a49293294aa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
双端非阻塞(Deque)
ConcurrentLinked~
原子类
无锁方案原理:增加了硬件支持,即CPU的CAS指令
ABA问题:有解决ABA问题的需求时,增加一个递增的版本号纬度化解
AtomicMarkableReference
AtomicStampedReference
分类:原子化基本数据类型,原子化引用类型、原子化数组、原子化对象属性更新器、原子化累加器
netty
BIO、NIO和AIO的区别
BIO
AIO
NIO
Netty 高性能表现
IO 线程模型
阻塞IO,每个连接都需要一个线程
非阻塞IO,IO 线程模型
IO复用(一般用epoll)
reactor模型
proactor模型
领导者/追随者模型
多路复用的实现有方式
epoll
select
poll
内存零拷贝
内存池设计
串形化处理读写
高性能序列化协议
netty源码重要
EventLoopGroup
一个EventLoopGroup包含一个或者多个EventLoop
EventLoop
一个EventLoop在它的生命周期内只和一个Thread绑定
所有由EventLoop处理的I/O事件都将在它专有的Thread上被处理
Channel
一个Channel在它的生命周期内只注册于一个EventLoop
一个EventLoop可能会被分配给一个或多个Channel
ChannelPipeline
每个Channel会绑定一个ChannelPipeline,ChannelPipeline中也会持有Channel的引用
每个Pipleline中维护了一个ChannelHandler链表队列
ChannelHandler
ChannelHandler用于处理Channel对应的事件
ChannelInboundHandler与ChannelOutboundHandler
ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandler这三个适配类,在使用的时候只需要实现你关注的方法
ChannelHandlerContext
每个ChannelHandlerContext会对应一个ChannelHandler,也就相当于ChannelPipeline持有ChannelHandler链路
ChannelPipeline持有ChannelHandlerContext链路,保留ChannelHandlerContext的头尾节点指针
ChannelHandlerContext同时也会持有ChannelPipeline引用,也就相当于持有Channel引用
MyBatis
Interceptor
核心对象
SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
Executor
MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler
封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合
ParameterHandler
负责对用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
TypeHandler
负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement
MappedStatement维护了一条mapper.xml文件里面 select 、update、delete、insert节点的封装
SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql
表示动态生成的SQL语句以及相应的参数信息
Configuration
MyBatis所有的配置信息都维持在Configuration对象之中
spring
依赖注入(Ioc)
依赖
依赖倒置
控制反转(IoC)
依赖注入(DI)
Beans
spring事务管理
传播行为(propagation behavior)7种
PROPAGATION_REQUIRED
表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
PROPAGATION_SUPPORTS
表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行
PROPAGATION_MANDATORY
表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
PROPAGATION_REQUIRED_NEW
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_NOT_SUPPORTED
表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_NEVER
表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
PROPAGATION_NESTED
表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务
隔离级别
ISOLATION_DEFAULT
使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
ISOLATION_READ_COMMITTED
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
ISOLATION_REPEATABLE_READ
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
ISOLATION_SERIALIZABLE
最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的
AOP
相关术语
Aspect
表示切面。切入业务流程的一个独立模块
Join point
表示连接点。也就是业务流程在运行过程中需要插入切面的具体位置。例如,前面案例的AopEmailNotice类的setTeacher方法就是一个连接点
Advice
表示通知。是切面的具体实现方法。可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)五种。实现方法具体属于哪类通知,是在配置文件和注解中指定的
Pointcut
表示切入点。用于定义通知应该切入到哪些连接点上,不同的通知通常需要切入到不同的连接点上
Target
表示目标对象。被一个或者多个切面所通知的对象
Proxy
表示代理对象。将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象为目标对象的业务逻辑功能加上被切入的切面所形成的对象
JDK动态代理
CGLIB代理
Weaving
表示切入,也称为织入。将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期
增强类型
before(前置)
after(后置)
afterReturning(最终)
afterThrowing(异常)
AOP的使用场景
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
Spring MVC
spring MVC常用注解
@Controller
@RequestMapping
@ResponseBody
@RequestBody
@RequestParam
@PathVarible
@RestController
@GetMapping@DeleteMapping@PostMapping@PutMapping
@SessionAttribute
@ModelAttribute
@HeaderValue
@CookieValue
拦截器
springboot
常用注解
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@PropertySource
@ConfigrationProperties
springboot-start-sample编写
springCloud
TimerTask 和 Quartz比较
精确度和功能
Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而 TimerTask则没有
Quartz每次执行任务都创建一个新的任务类对象,而TimerTask则每次使用同一个任务类对象。
Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务;而TimerTask则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务
dubbo
服务注册
serviceConfig
proxy
Invoker
protocol
Exporter
服务发现
ReferenceConfig
Protocol
Invoker
proxy
ref
dubbo minitor
集群容错
Failfast
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录
Failsafe
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作
Failback
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
Forking
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数
Broadcast
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息
协议
dubbo
rmi
hessian
http
webservice
thrift
注册中心
Zookeeper
dubbo在注册中心路径
/dubbo
暴露接口类(/com.ftx.product.service.TestService)
/consumers
consumer%3A%2F%2F172.28.135.241%2Fcom.ftx.product.service.TestService%3Fapplication%3Dorder-service-consumer%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.0.2%26interface%3Dcom.ftx.product.service.TestService%26lazy%3Dfalse%26methods%3Dhello%26pid%3D4556%26qos.enable%3Dfalse%26release%3D2.7.3%26side%3Dconsumer%26sticky%3Dfalse%26timestamp%3D1575279521541
consumer://172.28.135.241/com.ftx.product.service.TestService?application=order-service-consumer&category=consumers&check=false&dubbo=2.0.2&interface=com.ftx.product.service.TestService&lazy=false&methods=hello&pid=4556&qos.enable=false&release=2.7.3&side=consumer&sticky=false&timestamp=1575279521541
/configurators
/routers
/providers
dubbo%3A%2F%2F172.28.135.241%3A20880%2Fcom.ftx.product.service.TestService%3Fanyhost%3Dtrue%26application%3Duser-service-provider%26bean.name%3DServiceBean%3Acom.ftx.product.service.TestService%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26interface%3Dcom.ftx.product.service.TestService%26methods%3Dhello%26pid%3D8376%26register%3Dtrue%26release%3D2.7.3%26side%3Dprovider%26timeout%3D300%26timestamp%3D1575279502255
dubbo://172.28.135.241:20880/com.ftx.product.service.TestService?anyhost=true&application=user-service-provider&bean.name=ServiceBean:com.ftx.product.service.TestService&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.ftx.product.service.TestService&methods=hello&pid=8376&register=true&release=2.7.3&side=provider&timeout=300&timestamp=1575279502255,
dubbo://172.28.135.241:20881/com.ftx.product.service.TestService?anyhost=true&application=user-service-provider&bean.name=ServiceBean:com.ftx.product.service.TestService&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.ftx.product.service.TestService&methods=hello&pid=15656&register=true&release=2.7.3&side=provider&timeout=300&timestamp=1575281809296
Nacos
Redis
Multicast
simple
序列化
json
hessian
Kryo
FST
Protobuf
Protostuff
Thrift
Avro
MsgPack
ZooKeeper
四种数据节点
PERSISTENT
PERSISTENT_SEQUENTIAL
EPHEMERAL
EPHEMERAL_SEQUENTIAL
ZAB 协议
ZAB 和 Paxos 算法的联系与区别
redis
redis集群一致性hash问题
redis存放数据类型
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
GEO
搭建模式
单节点实例
主从模式(master/slaver)
sentinel模式
cluster模式
Redis持久化的几种方式
RDB
# 时间策略
save 900 1
save 300 10
save 60 10000
# 文件名称
dbfilename dump.rdb
# 文件保存路径
dir /home/work/app/redis/data/
# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes
# 是否压缩
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
AOF
# 是否开启aof
appendonly yes
# 文件名称
appendfilename "appendonly.aof"
# 同步方式
appendfsync everysec
# aof重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载aof时如果有错如何处理
aof-load-truncated yes
# 文件重写策略
aof-rewrite-incremental-fsync yes
Redis的内存淘汰策略(maxmemory-policy volatile-lru)
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
大概计算数据所占用的内存,然后可以在配置文件里面设置maxmemory(单位是byte字节)参数和参数maxmemory-policy(过期策略)
0 条评论
下一页