0%

Paxos算法不容易实现,Raft算法是对Paxos算法的简化和改进。

Raft算法将一致性问题分解为两个的子问题,Leader选举(Leader election)和日志复制(Log Replication)

Raft协议的节点有三种状态:LeaderFollowerCandidate

Leader:所有对系统的修改都会先经过leader。每个修改操作都会写一条日志,然后将日志复制到所有Follower节点,多数Follower节点响应时才提交日志,然后通知Follower节点提交日志,这个过程叫做Log Replication

Follower:所有节点都以follower的状态开始,如果没收到Leader的心跳则会变成Candidate状态。

Candidate:发起投票,如果得到多数节点的选票则成为Leader,这个过程叫做Leader election。等待超时会重新发起投票,竞选失败(收到了Leader的心跳)则会变成Follower状态。

Raft官网

Raft论文

Raft动画演示

阅读全文 »

JVM中提供的synchronized和Lock锁都是JVM级别的,也就是说synchronized和Lock只在同一Java进程内有效,当我们需要实现多个JVM进程之前的线程互斥时,我们就需要使用分布式锁了。

注意:相比单机锁,分布式锁并不能提高性能,甚至由于网络IO,会降低系统的性能。在高并发环境,可以先尝试获取单机锁,如果单机锁获取失败则无需尝试获取分布式锁,避免多余的网络IO降低系统性能。如果获取单机锁成功,再尝试获取分布式锁。

分布式锁特性

  • 互斥性:保证只有一个线程持有同一把锁。
  • 健壮性:避免死锁,锁不会被永久持有,即使服务奔溃了,也要保证锁在一定期间内会被安全释放。
  • 高可用性:除非整个分布式系统瘫痪,只要有服务存活,都允许获取和释放锁。
  • 安全性:谁上的锁由谁释放,不能被其他线程解锁。
阅读全文 »

ThreadLocal 的作用是提供线程内的局部变量,这种变量只在线程的生命周期内起作用。

ThreadLocal 可以用来减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度,但是如果滥用就可能会导致内存泄漏。

阅读全文 »

ReentrantReadWriteLock是读写锁的实现,写锁基于AQS的独占模式,读锁基于AQS的共享模式,读锁和写锁默认采用非公平锁,是一种可重入锁。

可以在构造方法中指定是公平锁还是非公平锁

阅读全文 »