sofastack / sofa-jraft

A production-grade java implementation of RAFT consensus algorithm.
https://www.sofastack.tech/projects/sofa-jraft/
Apache License 2.0
3.56k stars 1.14k forks source link

时间轮问题 #1018

Closed leakey0626 closed 1 year ago

leakey0626 commented 1 year ago

您好!我在研究代码架构的时候发现 jraft 是通过时间轮实现任务定时的。据我了解时间轮比较适合大量定时任务调度的场景,在 raft 场景下似乎只有心跳、选举、下台等少数几个任务,利用定时线程池是否也能满足性能要求、并且能带来更高的精度?期待您的答复~

fengjiachun commented 1 year ago

这个其实不需要台纠结,jraft 两者都提供了, jraft 里面 timer 是一个 interface,你提到的两种实现都有,hashedwheel 主要好处就是时间复杂度O(1),而基于二叉堆优先级队列的 scheduler 时间复杂度是 O(log N)。 大量小任务适合 hasedwheer 倒是没问题,但也不代表它不适合少量任务,另外你提到的 心跳、选举 等任务应该是少数“几类”任务,其实量可能不小

关于”精度“,你也可以看到 jraft 里面都是毫秒配置,基本上毫秒级精度足够了,这一点上 hashedwheer 应该没什么劣势。

leakey0626 commented 1 year ago

这个其实不需要台纠结,jraft 两者都提供了, jraft 里面 timer 是一个 interface,你提到的两种实现都有,hashedwheel 主要好处就是时间复杂度O(1),而基于二叉堆优先级队列的 scheduler 时间复杂度是 O(log N)。 大量小任务适合 hasedwheer 倒是没问题,但也不代表它不适合少量任务,另外你提到的 心跳、选举 等任务应该是少数“几类”任务,其实量可能不小

关于”精度“,你也可以看到 jraft 里面都是毫秒配置,基本上毫秒级精度足够了,这一点上 hashedwheer 应该没什么劣势。

十分感谢您的解答。有个地方还不是很理解,为什么说这几类任务“量可能不小”,意思是一个进程可能会运行多个raft实例吗?如果一个进程对应一个实例的话,像心跳这个任务应该只有一个?不知道我的理解对不对

fengjiachun commented 1 year ago

一个进程内是会有多个 raft group 的,也就是 multi raft,不过确实也不够海量

leakey0626 commented 1 year ago

好的,这块知识我还比较欠缺,等我学习完multi raft应该就能理解了,再次感谢