目录
1.java
IO/NIO
Java面试常考的 BIO,NIO,AIO 总结
java.nio.Buffer 中的 flip()方法
NIO学习(八):Java NIO的Buffer的slice和asReadOnlyBuffer方法以及链式写法
ByteBuffer源码分析
Java8+
理解、学习与使用 JAVA 中的 OPTIONAL TODO 没看完
concurrent
【Java并发之】BlockingQueue
java中Condition类的详细介绍(详解) TODO 后半部分aqs那里还没看
Java并发编程之Phaser类
2.Netty
Netty channelRegistered\ChannelActive—源码分析 TODO 没看完
3.分布式
技术组件、功能
avro
paxos
- 首先,英语基础好的啃原文吧https://www.microsoft.com/en-us/research/uploads/prod/2016/12/paxos-simple-Copy.pdf
- 参考《从Paxos到Zookeeper 分布式一致性原理与实践》这本书中 page 34中的一些理论
- https://www.zhihu.com/question/19787937 中 GRAYLAMB的回答
- 理解算法的一些要点
- 算法分为proposer和acceptor两个角色(以及最终的learner),proposer的核心思想是尽快达成选举一致(而不是把自己选为主)。过程分为prepare和accept
- 整个过程可以理解为,在prepare阶段,在一次选主过程中(分布式的很多场景都可以通过选主解决,选主可以避免单点故障,也可以保证一致性)最开始所有proposer携带<k,v> 其中k是编号,v是提案。那么形象而言是,携带<时间戳A,空> 向acceptor发起一次prepare。假设此时
- acceptor没有接受过任何人的prepare请求,那么直接返回<时间戳A,空>
- acceptor接受过<时间戳1,serverId 1> <时间戳2,serverId 2> <时间戳3,serverId 3> 且 时间戳1、2、3中最大的是时间戳3,且时间戳3小于时间戳A。则响应<时间戳A,serverId 3>
- acceptor接受过<时间戳1,serverId 1> <时间戳2,serverId 2> <时间戳3,serverId 3> 且 时间戳1、2、3中最大的是时间戳3,且时间戳3小于时间戳A。则拒绝响应
- 在accept阶段,假设某个proposer接收到了超过半数acceptor的响应,则可以发起一次accept。其中携带的<k,v>是 <时间戳A,serverId 2 > (serverId2是响应中max时间戳对应的serverId,但存在一种情况,acceptor中的所有响应中都没有serverId,则此时携带自身的serverId(即没有发现任何已存在的其他候选人,则自己成为候选人))发起一次accept 此时
- acceptor没有对 时间戳> 时间戳A的任何prepare请求响应过,则直接接受这次提案,返回ack
- 当然,在proposer从得到prepare响应到发起accept请求这顿时间里,可能acceptor已经接收到别的时间戳更大的请求了,那么此时,acceptor将拒绝这次proposer的请求。
- 假设有半数acceptor都ack了 <时间戳A,serverId 2 > 这一次请求,则serverId 2 被选为主,将会主导后续的工作,包括learning等。否则,proposer将发起下一次prepare(更大的时间戳)(有发生 活锁 的可能)
- learing 过程 TODO
Disruptor
线程模型
HELIX
Apache Helix - Quick Start
Helix Javadoc
Apache Helix / Release 0.6.8 / Tutorial