iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
886 stars 192 forks source link

action 返回值增加 byte[] 支持 #74

Closed iohao closed 1 year ago

iohao commented 1 year ago

在 action 中返回 byte[] 可以避免业务数据的序列化,达到性能的提升;

伪代码 - 使用示例

@ActionController(1)
public class DemoAction {
    static byte[] byteData;

    static {
        HelloReq helloReq = new HelloReq();
        byteData = DataCodecKit.encode(helloReq);
    }

    @ActionMethod(1)
    public byte[] here() {
        return byteData;
    }
}

使用场景: 请求较为频繁的,数据不常变动的;如一些配置数据信息:装备的配置、道具的配置... 等。我们可以在 excel 或 DB 读取到这些配置数据后,将数据提前转换为 byte[] ;

请求端在请求配置数据时,可以在 action 中直接将该 byte[] 返回,可以避免序列化操作从而达到性能的提升;

iohao commented 1 year ago

经过思考,决定取消 action 返回值 byte[] 类型的支持。 因为这会导致在生成文档时,不知道其具体的类型,从而增加沟通负担;

路由: 1 - 4  --- 【】 --- 【DemoAction:120】【testByte】
    方法参数: IntValue
    方法返回值: [B

可扩展

如果开发者有需要,可以自行扩展,扩展协议参考 https://www.yuque.com/iohao/game/uq2zrltrc7to27bt

以 proto 编解码器为例,只需要在 encode 方法添加如下逻辑

public final class MyProtoDataCodec implements DataCodec {
    @Override
    public byte[] encode(Object data) {
        if (data instanceof byte[] bytes) {
            return bytes;
        }

        return ProtoKit.toBytes(data);
    }

    ... 省略部分代码
}

将自定义的,添加到框架中

// 设置自定义的编解码。如果不做设置,默认使用 jprotobuf
IoGameGlobalSetting.setDataCodec(new MyProtoDataCodec());

action byte[] 使用展示

@Slf4j
@ActionController(1)
public class DemoAction {
    static byte[] helloReqData;

    static {
        // 这里模拟缓存数据,不用每次序列化
        HelloReq helloReq = new HelloReq();
        helloReq.theIndex = 100;
        helloReq.name = "to byte[]";
        helloReqData = DataCodecKit.encode(helloReq);
    }

    @ActionMethod(4)
    public byte[] testByte(int id) {
        return helloReqData;
    }
}

原用意

之前是为了少一次序列化操作,节约一些 cpu,特别是在请求访问一些固定配置数据表时;但这样的编码格式增加了以后的维护成本,也增加了沟通成本,综合下来决定取消支持。另外一个原因是,找到了一种更加彻底的方式,就是游戏对外服缓存特性;

关于游戏对外服缓存特性可阅读 #76

这种方式不但能节约 CPU,还能减少传输、请求次数、无形中帮助游戏逻辑服做了一些防护性措施等,并且不破坏代码可读性。