youngyangyang04 / KVstorageBaseRaft-cpp

【代码随想录知识星球】项目分享-基于Raft的k-v存储数据库🔥
574 stars 113 forks source link

feat:协程引入以减少线程数量 #16

Closed 578223592 closed 7 months ago

578223592 commented 9 months ago

本仓库目前https://github.com/youngyangyang04/KVstorageBaseRaft-cpp/commit/81280b5ff22cbf93445d0c203cb625580ca35423 在raft节点这一层要启动的线程有: Raft::leaderHearBeatTicker():负责循环发送心跳和日志

Raft::electionTimeOutTicker():负责循环的发起选举

Raft::applierTicker():负责循环的写kv(通过向applyChan不断地提交日志代码

那么,对于这三个线程,经常要做的事情就是不停的sleep,导致白白的浪费了三个线程,这时候是不是就可以用协程代替这三个线程。 这样就可以节约线程数量了。

可能需要注意的问题:

1.正确性:注意协程的调度时间的控制,因为对于选举和心跳来说,都有超时的机制,如果超时又会发起新的选举,对于applierTicker()来说还好,只是会影响提交效率,最起码不会影响正确性。

但是对于选举和心跳,其并不能严格保证定时的唤醒时间的话可能会导致频繁的触发。因此在使用协程库的时候需要注意这一点,先测试下时间再看下,可能涉及对选举时间和心跳时间做一些改进。

待学习:

频繁的睡眠和线程数量过多可能会对系统的性能和资源利用产生不利影响。在计算机编程中,线程是用于并发执行的最小单位,而睡眠通常是用于暂停线程的执行一段时间。

以下是频繁睡眠和过多线程可能带来的一些不利影响:

性能下降: 频繁睡眠会导致线程在执行过程中频繁地暂停和恢复,这会增加上下文切换的开销,并降低系统的整体性能。

资源浪费: 过多的线程会占用系统资源,包括内存和CPU时间片等。即使这些线程在某些时候处于睡眠状态,它们仍然会占用资源,导致资源浪费。

竞争条件和死锁: 过多的线程可能导致竞争条件和死锁。竞争条件是指多个线程竞争访问共享资源时可能出现的不确定行为。而死锁则是指多个线程互相等待对方释放资源而导致的僵局。

复杂性增加: 过多的线程会增加系统的复杂性,使得代码更难以理解、调试和维护。

内存消耗增加: 每个线程都需要一定量的内存来存储其状态信息。过多的线程会增加系统的内存消耗。

因此,在设计和实现多线程应用程序时,需要权衡线程数量和频繁睡眠的情况,以充分利用系统资源并确保良好的性能和可维护性。

TiNnNnnn commented 8 months ago

这部分我可以来,大概2月底写完

578223592 commented 8 months ago

这部分我可以来,大概2月底写完

虽然我已经在做这个任务了,但是非常高兴新朋友加入。这个任务由你完成吧,或许你可以先给我一个简单的时间计划或者更改计划,这样方便我知道你后续的计划。 @TiNnNnnn

TiNnNnnn commented 8 months ago

@578223592 2月15号之前会提交一个初始版本,30号之前会修改出最终版本

578223592 commented 8 months ago

@578223592 2月15号之前会提交一个初始版本,30号之前会修改出最终版本

great!期待你的pr

TiNnNnnn commented 8 months ago

已提交PR,可以检查一下 @578223592

578223592 commented 8 months ago

已提交PR,可以检查一下 @578223592

@TiNnNnnn 已经提了一些意见,可以查看一下

TiNnNnnn commented 8 months ago

是指代码风格统一那个issue吗

578223592 commented 8 months ago

是指代码风格统一那个issue吗

对的,这两天我会统一下代码风格,这样的话代码风格和功能开发的pr就可以分开提交了(以后也不用单独提交代码风格的pr了)。 你可以等那个issue提交之后再修改下你的pr。 https://github.com/youngyangyang04/KVstorageBaseRaft-cpp/issues/31


关于你的pr https://github.com/youngyangyang04/KVstorageBaseRaft-cpp/pull/29 我的设想是只将

Raft::leaderHearBeatTicker():负责循环发送心跳和日志

Raft::electionTimeOutTicker():负责循环的发起选举

Raft::applierTicker()

这三个函数使用协程来处理,我看你将更多的函数使用了协程处理,这两天我也会评估下这么做的可行性与优缺点。

578223592 commented 8 months ago

是指代码风格统一那个issue吗

done. https://github.com/youngyangyang04/KVstorageBaseRaft-cpp/pull/34

TiNnNnnn commented 8 months ago

抱歉,临近开学,杂事较多,这几天无法进行开发

578223592 commented 7 months ago

抱歉,临近开学,杂事较多,这几天无法进行开发

@TiNnNnnn 已经修改完合入了,感谢贡献,欢迎下次贡献或者提出改进意见,一起加油 #29