Skip to content

Feature/lock#244

Open
a981008 wants to merge 4 commits intonacos-group:masterfrom
a981008:feature/lock
Open

Feature/lock#244
a981008 wants to merge 4 commits intonacos-group:masterfrom
a981008:feature/lock

Conversation

@a981008
Copy link
Contributor

@a981008 a981008 commented Aug 8, 2025

refs: #243

@lingma-agents
Copy link

lingma-agents bot commented Aug 8, 2025

实现分布式锁功能并更新相关依赖

变更概述
  • 新功能

    • 新增分布式锁模块,支持通过Nacos实现分布式锁的获取与释放。
    • 添加了LockActor用于管理锁状态,并通过Raft协议保证一致性。
    • 实现了gRPC接口LockOperationRequest处理加锁、解锁和过期操作。
    • 在Java SDK示例中提供了使用Nacos客户端进行分布式锁操作的示例代码。
  • 依赖更新

    • Java示例项目升级Nacos客户端版本至3.0.2。
    • 添加了SLF4J和Logback依赖以支持日志记录。
  • 重构

    • 将锁相关的模型定义移至独立模块src/lock/model.rs
    • 重构Raft请求路由逻辑,新增对锁请求的支持。
  • 配置调整

    • 在常量文件中添加LOCK_TREE_NAME用于标识锁存储树。
    • 更新gRPC连接设置,支持能力协商(ability negotiation)。
  • 测试更新

    • 提供了完整的Java SDK示例,演示如何在多线程环境中使用Nacos锁服务。
变更文件
文件路径 变更说明
sdk-examples/​java/​nacos3xlock/​pom.​xml 新增Maven项目配置文件,定义了Nacos客户端及相关依赖的版本,包括日志框架和JUnit测试库。
sdk-examples/​java/​nacos3xlock/​src/​main/​java/​com/​my/​nacos/​lock/​App.​java 实现了Java应用程序示例,展示如何使用Nacos客户端进行分布式锁的操作,包括连接集群、获取锁、释放锁等步骤。
sdk-examples/​java/​nacos3xlock/​src/​main/​resources/​logback.​xml 配置Logback日志输出格式,确保控制台能够正确显示调试信息。
src/common/constant.rs 添加了`LOCK_TREE_NAME`常量,用于标识锁数据存储的表名。
src/grpc/api_model.rs 扩展了gRPC API模型,新增锁操作请求和响应结构体,以及支持能力协商的相关字段。
src/grpc/bistream_manage.rs 更新双向流管理器,支持客户端能力表的传递与确认机制。
src/grpc/handler/lock.rs 新增锁请求处理器,负责接收并处理来自客户端的锁操作请求,并通过Raft转发给锁Actor执行。
src/grpc/handler/mod.rs 注册锁请求处理器到gRPC调用处理器中,使系统能够识别并处理锁相关请求。
src/lib.rs 暴露`lock`模块,使其可以在其他模块中被引用。
src/lock/mod.rs 创建锁模块核心逻辑,包含锁的获取、释放及定时清理过期锁的功能。
src/lock/model.rs 定义锁实例和Raft请求的数据结构,用于在系统内部传递锁相关信息。
src/main.rs 在主函数中初始化锁处理器,将其注册到gRPC调用链中。
src/raft/cluster/mod.rs 扩展Raft集群处理逻辑,增加对锁请求的路由支持。
src/raft/cluster/model.rs 更新Raft集群模型,新增锁请求和响应的枚举类型。
src/raft/cluster/route.rs 实现锁请求的路由方法,支持本地和远程节点的锁操作。
src/​raft/​filestore/​raftapply.​rs 更新Raft日志应用逻辑,增加对锁请求的处理流程。
src/​raft/​filestore/​raftdata.​rs 更新Raft数据包装结构,加入锁Actor地址以便于通信。
src/raft/store/mod.rs 扩展Raft存储模型,新增锁请求和响应的定义。
src/starter.rs 在系统启动时初始化锁Actor,并将其注册到工厂中供后续使用。

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

@heqingpan
Copy link
Collaborator

本周末人都在外面,晚点处理。

#241 mcp相关支持的分支中对raft存储有做一些代码重构应该会有些冲突,到时处理估计要花些时间。

@heqingpan
Copy link
Collaborator

还没有运行代码验证,初步看了一下代码,把看到的问题点列一下。

  1. LockActor中的表数据接入raft,不过只接入log,没有接入snapshot打包和加载。

raft为了避免log无限增长,每写入一定量(默认是1万,可配置)log,就会触发snapshot。触发snapshot时会把当前数据全部写入snapshot文件,然后标记snapshot后的日志点位;下次重启时会先加载snapshot,再加载snapshot点位后的日志。

如果一个表数据没有接入snapshot,那么在snapshot后重启之后,或者snapshot后有新节点接入就会数据丢失问题。

  1. T_LOCK表数据没有接入数据备份与恢复,备份数据恢复后锁信息会丢失。

  2. lock expire操作暂还不支持。

@heqingpan
Copy link
Collaborator

heqingpan commented Aug 12, 2025

可参考NamespaceActor,实现impl Handler<RaftApplyDataRequest> for NamespaceActor,同时在调用点加上对LockActor的调用完成对raft snapshot的接入。

@heqingpan
Copy link
Collaborator

heqingpan commented Aug 12, 2025

关于raft 锁的支持,我之前有设想是可以和redis类似通过自带的缓存(CacheManager)来实现。

在ratch-job中,实现已经实现了类似redis锁的功能( ratch-job cache_core ),但r-nacos的CacheManager目前不是直接接入raft,而是通过TableManager,还不能直接完备支持锁的功能。

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支持锁。

@heqingpan
Copy link
Collaborator

支持mcp服务已发布,这个功能计划近期处理。

其中的raft存储层,可能会直接换成r-nacos现有的缓存(其缓存核心功能还需要先优化补充)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants