Conversation
实现分布式锁功能并更新相关依赖变更概述
变更文件
💡 小贴士与 lingma-agents 交流的方式📜 直接回复评论
📜 在代码行处标记
📜 在讨论中提问
|
|
本周末人都在外面,晚点处理。 在 #241 mcp相关支持的分支中对raft存储有做一些代码重构应该会有些冲突,到时处理估计要花些时间。 |
|
还没有运行代码验证,初步看了一下代码,把看到的问题点列一下。
raft为了避免log无限增长,每写入一定量(默认是1万,可配置)log,就会触发snapshot。触发snapshot时会把当前数据全部写入snapshot文件,然后标记snapshot后的日志点位;下次重启时会先加载snapshot,再加载snapshot点位后的日志。 如果一个表数据没有接入snapshot,那么在snapshot后重启之后,或者snapshot后有新节点接入就会数据丢失问题。
|
|
可参考 |
|
关于raft 锁的支持,我之前有设想是可以和redis类似通过自带的缓存( 在ratch-job中,实现已经实现了类似redis锁的功能( ratch-job cache_core ),但r-nacos的 cache中类似redis支持缓存锁相关代码片段: impl Handler<CacheManagerRaftReq> for CacheManager {
type Result = anyhow::Result<CacheManagerRaftResult>;
fn handle(&mut self, req: CacheManagerRaftReq, _ctx: &mut Self::Context) -> Self::Result {
match req {
CacheManagerRaftReq::Set(set_info) => Ok(self.set(set_info)),
CacheManagerRaftReq::GetSet(set_info) => Ok(self.get_set(set_info)),
CacheManagerRaftReq::Get(key) => Ok(self.get_value(&key)),
CacheManagerRaftReq::Remove(key) => Ok(self.remove(&key)),
CacheManagerRaftReq::Exists(key) => Ok(self.exists(&key)),
CacheManagerRaftReq::Expire(key, expire) => Ok(self.expire(key, expire)),
CacheManagerRaftReq::Ttl(key) => Ok(self.get_ttl(&key)),
CacheManagerRaftReq::Incr(key, expire) => Ok(self.incr(key, expire)),
CacheManagerRaftReq::Decr(key, expire) => Ok(self.decr(key, expire)),
}
}
}之前提到接入mcp时对r-naocs raft有些重构,它的目标之一也是包括给现有的cache提供更强的能力。 上面是我之前对锁支持方式的思考。 本次我们可以先按你这次加的LockActor实现锁的功能,后面时机合适再考虑是否切换到cache支持锁。 |
|
支持mcp服务已发布,这个功能计划近期处理。 其中的raft存储层,可能会直接换成r-nacos现有的缓存(其缓存核心功能还需要先优化补充)。 |
refs: #243