180 Star 1.6K Fork 502

渔民小镇 / ioGame

 / 详情

逻辑服之间调用问题、无锁化

已完成
创建于  
2022-06-23 18:06

如果b服调用a服的函数,b服要等待该函数返回才能继续往下执行,这种场景支持吗

评论 (6)

Mark 创建了任务

逻辑服之间的调用是同步的

请问 如果多个逻辑服同时修改一个共享服,按实例那样直接调吗,可以不用加锁处理吧

调用方不需要加锁。

修改时,建议加锁来处理。
或者通过 disruptor 并发框架来处理、或者通过其他的并发框架来处理。
框架内也提供了一个 disruptor 相关模块,可以按需选择
https://www.yuque.com/iohao/game/gmfy1k

看来还是得加锁,disruptor 没办法返回值,不然就得在发个事件通知结果,这样代码又难以维护

是的,这种需要同时写的,加锁会简单一些;
不过理论上是可以做到无锁化的,逻辑服处理业务逻辑服的关键代码在 RequestMessageClientProcessor 中,下个版本开放一个接口,这样开发者就可以在这上面编排线程了。

        // 得到逻辑服对应的业务框架
        BarSkeleton barSkeleton = ...;
        // 通过业务框架把请求派发给指定的业务类(action)来处理
        barSkeleton.handle(flowContext);

这里是处理业务逻辑服关键部分;
之后开放一个接口,我们可以根据需求通过 cmd、subCmd 路由来编排需要加入队列的请求;

大概思路就是使用 JCTools 提供的并发包,把上面的关键代码放到无锁队列中。

大概的代码如下

public void processLogic(BarSkeleton barSkeleton, FlowContext flowContext) {
    CmdInfo cmdInfo = flowContext.getActionCommand().getCmdInfo();
    // 路由
    int cmdMerge = cmdInfo.getCmdMerge();
    
    if (cmdMerge == 你需要同步执行的路由) {
        // 编排到队列中,或者在这里把 barSkeleton.handle(flowContext); 放到 disruptor 中执行
        // 这样就可以无锁了。
        
    } else {
        barSkeleton.handle(flowContext);
    }
}
渔民小镇 任务状态待办的 修改为进行中
渔民小镇 负责人设置为渔民小镇
渔民小镇 添加了
 
功能增强
标签
渔民小镇 计划截止日期设置为2022-07-04

现在已经新增 业务线程编排-钩子接口
相关使用文档
https://www.yuque.com/iohao/game/eixd6x

渔民小镇 任务状态进行中 修改为已完成
渔民小镇 修改了标题
渔民小镇 添加了
 
使用技巧
标签

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
5475 iohao 1653332816
Java
1
https://gitee.com/iohao/ioGame.git
git@gitee.com:iohao/ioGame.git
iohao
ioGame
ioGame

搜索帮助