funny / link

Go语言网络层脚手架

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

内置消息分发接口?

bg5sbk opened this issue · comments

目前的接口抽象度太高,从零开始搭建一个服务端的过程不够流畅,前期准备工作太多。

对于网关和游戏这种分包 + 多消息类型的项目,都会需要重头构建一套消息识别和派发的CodecType。

是不是应该内置进消息识别和分发的接口,就可以配合fastbin或者别的协议工具快速搭建项目。

想象中应该像这样:

server, _ := link.Serve("tcp", "0.0.0.0:10010", 
    link.Packet(2, 65535, 4096, link.Uint16Handlers{
        1: PingMsgHandler,
        2: PongMsgHandler,
    }),
)

session, _ := server.Accept()

var msg link.Request

session.Receive(&msg)

msg.Process()
server, _ := link.Serve("tcp", "0.0.0.0:10010", 
    link.Packet(2, 65535, 4096, link.Uint16Dispatch(link.Handlers{
        1: PingMsgHandler,
        2: PongMsgHandler,
    })),
)

如果是这样的接口,可以让link.Handlers统一用map,Dispatch那层可以自行做优化,比如Uint16Dispatch的消息容量只有256,所以可以直接用数组,比起map要高效很多。

建议可以类似于skynet, 不同的场景实现一个该场景比较通用的处理,就像网关, 大家的网关需求就比较一致。

嗯,我其实都想去掉link.Packet的可选参数,只保留2字节包头分包协议,留着实际上没啥意义又有危险性,消息分类其实我只想用uint16,需要别的分类方式可以自己另外搞。

如果把这些可选项都去掉,就会变得简单很多:

server, _ := link.Serve("tcp", "0.0.0.0:10010",  link.PacketHandlers{
        1: PingMsgHandler,
        2: PongMsgHandler,
})

第二种比较好,可以自定义Dispatch,可以通过做同步、异步接收,不同协议类型的解析等

可否考虑把可选参数放独立的配置文件,这样直接省掉也不方便定制啊

没有运行时变更的需要