Skip to content

Latest commit

 

History

History
47 lines (42 loc) · 6.08 KB

关于主动健康检查模块出现很多问题的原因分析以及优化方案.md

File metadata and controls

47 lines (42 loc) · 6.08 KB

关于主动健康检查模块出现很多问题的原因分析以及优化方案

主动健康检查模块出现很多问题的原因分析

结论在前
  • 从代码提交记录以及实现上看,该模块一开始可能并没有考虑动态增删节点的情况,加上在本地和共享内存中使用动态数组存储探测节点,节点状态以及数组索引容易错乱,代码不容易理解和维护,所以会遇到很多问题。 回到需求本身,主动健康检查模块功能其实比较简单,就是增删节点以及查询节点状态,对应红黑树的增删查操作,底层存储结构更适合使用红黑树, 不存在本地和共享内存中节点数组索引混乱以及通过节点delete状态复用数组元素空间的需求,从根本上避免了下述第1点和第2点带来的已发现以及尚未发现的问题,针对第3点合理控制共享内存锁粒度即可。
具体原因分析
  • 该模块在本地和共享内存中使用动态数组存储探测节点,需要处理好以下几点,但实际代码并没有处理好,很多问题稍微测试就能发现
    • 第1点-如何复用数组节点空间
    • 第2点-多进程时,如何保证本地节点正确关联到共享内存节点,如果通过index,需要保证本地数组index以及共享内存数组index的有效性以及关联的正确性
    • 第3点-多进程并发读写共享内存节点数组需要保证互斥
针对第1点-如何复用数组节点空间
针对第2点-多进程时,如何保证本地节点正确关联到共享内存节点,如果通过index,需要保证本地数组index以及共享内存数组index的有效性以及关联的正确性
针对第3点-多进程并发读写共享内存节点数组需要保证互斥
其他问题
  • 因为底层数组结构是数组,在增加节点以及查找可复用节点时都需要for循环,当节点数量较多时,使用数组并不高效
  • 代码冗余太多,尤其是status模块和探测模块的数据结构定义完全一致,只是结构体名称不一样,调整结构体成员变量时两边都需要修改,其实只需要共同包含一份定义即可
  • 不完全支持配置探测时使用长连接
  • 官方仓库最近一次提交日期是 Jun 4, 2021,一直没有更新

优化方案

  • 基于上述分析,我针对之前写的健康探测模块做了拓展,使其能和upstream相结合,完全支持主动健康检查模块的功能,主要区别就是底层存储结构使用的是红黑树以及部分功能增强,代码也更容易理解和维护。