常见的容错机制一般有四种:fail-fast, fail-safe, fail-over, fail-back.
1.fail-fast 快速失败
fail-fast即为快速失败机制是Java集合中的一种保护机制, 是集合中在内部维护了一个字段:modCount, 用来记录这个集合增删, 替换元素, 排序等操作修改的次数, 在遍历过程中remove(),add()等方法会对这个字段值进行校验, 校验失败后会抛出异常ConcurrentModificationException.
@Test
public void testFailFast() {
Listlist =new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
Iteratoriterator = list.iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
list.remove(i);
}
}
2.fail-safe 失败保护
fail-safe机制实现很简单, 就是将原来的集合copy一份, 复制一份快照, 然后基于新复制的快照集合进行遍历; CopyOnWriteArrayList是通过COWIterator遍历的, 通过源码也可以看出COWIterator持有对象的一份快照.
@Test
public void testFailSafe2() {
Listlist =new CopyOnWriteArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
Iteratoriterator = list.iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
list.remove(i);
}
}
3.fail-over 失效转移
fail-over是一种备份操作模式,当主要组件或服务异常时,自动转移到备份组件或服务.
例如: mysql的双主集群; redis的哨兵或集群模式下的主从切换; keepalived下的双机热备, zookeeper集群.
4.fail-back 失效自动恢复
fail-back是组件或服务失效之后的自动恢复, 一般恢复过程中, 都依赖第三方或调用端的检测机制, 定时检测失效服务状态, 并在检测到服务正常后, 重新加入到原有集群中.
例如: mysql的双主集群是另一节点; redis的哨兵集群自然是依赖哨兵节点; redis集群模式下的检测是依靠集群中的其他节点投票决定; keepalived下的双机热备也是依赖keepalived本身的定期检查; Hystrix的fallback处理.
5.总结
通过上面的分析可以发现:
fail-fast和fail-safe是针对数据访问时做的安全检查;
而fail-over和fail-back是针对组件和服务出故障的时候, 保证组件和服务的稳定.