分布式系统故障转移问题

详情见 1.0.5
我是一直想记录下来的,但是没来得及,也没想好怎么去记录。
下面记录个大概。
要做的功能:三个节点在运行,1号挂了,任务会转移,2/3两个节点抢占锁,来获取任务执行。

碰到的问题

问题 1)、监听器是一个线程,todo 监听器 和 running 监听器 两个线程的执行顺序问题。
可能存在如下情况:runnningRemove -> 抢到锁,创建 todo,在 running 还未解锁,此时 todo 监听到 add 事件,此时获取锁失败,不能创建running 节点。
解决方案:在监听器的每个方法中都加上 synchronized

在这里插入图片描述

问题 2)、抢占锁,未能释放锁。
可能存在,上锁,执行体发生异常,方法结束,未能执行解锁。
解决方案:上锁成功一定要保证解锁(把执行体使用try catch,保证不会异常跳出方法,从而导致不能解锁。)。
在这里插入图片描述

问题 3)、多节点执行顺序问题。
我们需要是自己创建的 todo 节点,一定要自己 running 起来。其他节点不能把别人创建的 todo 节点进行 running。
可能存在:1号机器创建 todo,解锁。此时准备创建running,准备获取锁的时候,别人获取锁,此时1号就获取不到锁了,创建失败。
解决方案:自己创建的 todo,使用死循环进行创建,直到获取到锁创建成功再退出。
在这里插入图片描述

记录代码

1)、SpringBoot 启动,会执行 zk.init 方法
在这里插入图片描述

2)、zk.init 做了三件事(在注释中,下面一步步解析)
在这里插入图片描述
》》》方法1、创建 running,todo,lock 三个路径
在这里插入图片描述
》》》方法2、设置节点缓存
在这里插入图片描述
》》》方法3、注册监听器。监听三个路径的节点变化。在这里插入图片描述

3)、Running 监听器,Todo 监听器(lock 作为锁使用)
在这里插入图片描述
在这里插入图片描述

4)、…省略