velocity判断foreach循环第一个和最后一个元素
1 | #foreach ($column in $columns) |
1 | #foreach ($column in $columns) |
Elasticsearch总结
新版本ES规定,同一个index下只能有1个type
过程
Docker 启动kibana和ES
1 | docker run --name kibana -p 5601:5601 \ |
1 | docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \ |
7.5.0的版本Docker安装
1 | ## 建立网络 |
1 | ## 将容器内的文件拷贝到本地 |
面试总结
8月7日
两阶段提交(ZooKeeper分布式提交算法)
- 提交事物请求(第一阶段)
- 事物询问:协调者向所有的参与者发送事物内容,询问是否可以执行事物操作,并开始等待各参与者的响应。
- 执行事物:各参与者节点执行事物操作,并将Undo和Redo信息记入事物日志中。
- 各参与者向协调者反馈事物询问的响应:如果参与者成功执行了事物操作,那么就反馈给协调者Yes响应,表示事物可以执行;如果参与者没有成功执行事物,那么就反馈给协调者No响应,表示事物不可以执行。
执行事物请求(第二阶段)
假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事物响应。
- 发送提交请求:协调者向所有参与者节点发出Commit请求
- 事物提交:参与者接收到Commit请求后,会正式执行事物提交操作,并在完成提交之后释放在整个事物执行期间占有的事物资源。
- 反馈事物提交结果:参与者在完成事物提交之后,向协调者发送Ack消息。
- 完成事物: 协调者接收到所有参与者反馈的Ack消息后,完成事物。
算法思路:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作
缺点:
- 执行过程中,同步阻塞
- 单点故障,协调者一旦发生故障,参与者一直阻塞
- 数据不一致,在提交时由于网络波动,只有一部分收到了commit请求,所以出现了数据不一致
三阶段提交
区别:三阶段提交在协调者和参与者中引入超时机制,并且把两阶段提交的第一阶段拆分为两步:询问,然后锁住资源,最后真正提交
- 阶段1: CanCommit
协调者询问参与者是否可以提交事物
- 阶段2: PreCommit
预提交,分为2种情况
- 第一种是上一阶段得到的反馈都是yes,那么向所有参与者发送preCommit请求,进入prepared阶段,参与者和接收到preCommit请求后会执行事务操作,并将undo和redo信息记录到事务日志中。如果一个参与者成功地执行了事务操作,则返回ACK响应,同时开始等待最终指令
有1个以上的NO:中断事务,协调者发送abort请求,参与者收到请求或者超时,执行事务中断
阶段3: DoCommit
根据第二阶段的响应来决定是否可以继续事务操作,分2种情况
- 协调者得到了参与者发出的ACK请求:那么它将预提交变更为提交状态
- 协调者从参与者没有得到ACK的反馈, 也可能是接收者发送的不是ACK响应,也可能是响应超时 ,执行事务中断
缺点:如果进入PreCommit后,协调者发出的是abort请求,假设只有一个Cohort收到并进行了abort操作,
而其他对于系统状态未知的Cohort会根据3PC选择继续Commit,此时系统状态发生不一致性。
Spring注入bean的3种方法
- 注解
- setter
- 构造器
synchronized与锁的区别
23种设计模式
简单工厂
- 简单工厂用于创建实例的方法通常为静态方法,因此简单工厂模式又被称为静态工厂方法
- 需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程
优点:1. 工厂类需要包涵必要的逻辑判断,可以决定什么时候创建哪一个产品实例。
2. 客户端无需知道所创建的具体产品类名,知道参数即可
3. 可以引入配置文件,在不修改客户端的情况下更换添加新的具体产品
- 抽象工厂
Java中,遍历数据结构Enumeration和Iterator相比有什么优劣?
mysql中排名函数
rank()
示例:SELECT Score,rank() over(ORDER BY Score desc) as 'Rank' FROM score
dense_rank()
示例:SELECT Score,dense_rank() over(ORDER BY Score desc) as 'Rank'
FROM score
row_number()
示例:SELECT Score,row_number() over(ORDER BY Score desc) as 'Rank'
FROM score
netty总结
- 对 NIO 进行封装
- 对数据处理灵活, Netty 支持多种序列化框架,通过“ChannelHandler”机制,可以自定义“编/解码器”
EventLoopGroup 包含了多个 EventLoop
EventLoop 服务于多个Channel 类似于监听器,通知服务端和客户端去获取消息
Channel相当于一个Socket
HttpURLConnection连接读取超时问题
最近公司遇到一个问题,HttpURLConnection明明一直在等待响应,但是一直不报超时,跟进了源码发现父类的UrlConnection
中定义了private int connectTimeout;
private int readTimeout;
这两个字段,我们知道int的默认值为0,即永远不会超时。
进行了如下测试
1 |
2020年整理面试题
HTTPS请求过程
浏览器向服务器发起请求,请求携带了浏览器支持的加密算法和哈希算法
服务器收到请求,选择浏览器支持的加密算法和哈希算法
服务器将数字证书返回给浏览器
浏览器进入数字证书的认证环节
浏览器生成一个随机数R,并使用网站公钥对R进行加密,浏览器将加密后的R传送给服务器
服务器通过自己的私钥解密得到R
服务器以R为密钥将使用了对称加密算法的加密网页内容传输给浏览器
浏览器以R为密钥使用之前约定好的解密算法获取网页内容
如果线上某台虚机CPU Load过高,该如何快速排查原因?只介绍思路和涉及的Linux命令即可
使用top命令可以查看哪个进程cup加载过高
- jps -v:查看java进程号
- top -Hp [java进程号]:查看当前进程下最耗费CPU的线程
- printf “%x\n” [步骤2中的线程号]:得到线程的16进制表示
- jstack [java进程号] | grep -A100 [步骤3的结果]:查看线程堆栈,定位代码行。参考:如何使用JStack分析线程状态
什么是分布式事务,分布式事务产生的原因是什么?分布式事务的解决方案有哪些?分别有哪些优缺点?
分布式事物:将一次大的操作分为很多小的操作,这些小的操作位于各自的服务器上,分布式事物需要保证这些小的操作要么全部成功,要么全部失败
队列
- 阻塞队列 (比如LinkedBlockingQueue、ArrayBlockingQueue)
- 非阻塞队列 (ConcurrentLinkedQueue)
阻塞和非阻塞区别
- 阻塞:试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来
- 非阻塞:和阻塞相反
基本方法
offer():往队列添加元素。如果队列已满直接返回false,队列未满则直接插入并返回true;
add():对offer()方法的简单封装。如果队列已满,抛出异常new IllegalStateException(“Queue full”);
put():往队列里插入元素,如果队列已经满,则会一直等待直到队列为空插入新元素,或者线程被中断抛出异常.
remove():直接删除队头的元素;
peek():直接取出队头的元素,并不删除。
element():对peek方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出异常NoSuchElementException();
pool():取出并删除队头的元素,当队列为空,返回null;
take():取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常