GuanceCloud / dd-trace-java

Datadog APM client for Java
https://docs.datadoghq.com/tracing/languages/java
Apache License 2.0
9 stars 3 forks source link

IoGame 支持 #49

Closed lrwh closed 9 months ago

lrwh commented 10 months ago

关于 IoGame

需求:

lrwh commented 10 months ago

IoGame 的交互主要是以 webSocket 技术进行实现,比如从客户端触发事件,将以 webSocket 方式发送到网关,进而调用游戏逻辑服处理业务流程。如若需要打通环节,本质上是需要处理 webSocket,支持 webSocket 的链路传递

lrwh commented 10 months ago

websocket 组件有很多,目前 IoGame 主要是使用了 org.java-websocket

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.2</version>
</dependency>
lrwh commented 10 months ago

进一步研究发现,IoGame 采用 com.alipay.sofa 框架来接受 websocket 服务(即使用 bolt 协议),充当 websocket server 端,以官方提供的坦克大战为例进行分析:

GameOne 服务端(websocket 视角)

TankApp 客户端(websocket 视角)


综上分析,除了接入org.java-websocket 进行埋点操作以外,还需要对 sofa 进行增强处理,才能完成socket 的链路串联。

lrwh commented 10 months ago

综上,总结一下:

  1. IoGame 采用了sofa 框架来保证各个业务的交互,采用了 websocket 方式进行游戏事件的投递
  2. IoGame 对外服(可以理解为游戏客户端)以 websocket 方式将游戏事件进行上报
  3. sofa 使用 bolt协议中的 RpcServerRemoting 来作为 websocket 的服务端接收数据

从链路的角度分析

  1. 游戏客户端(游戏对外服):通过 websocket 发送消息,需要产生 trace 信息,对应的组件为org.java-websocket
  2. 游戏网关:通过RpcServerRemoting 接收 websocket 消息,需要产生trace信息,对应的组件为com.alipay.sofa
  3. 游戏逻辑服:由游戏网关将客户端发送过来的指令分发到游戏逻辑服,需要产生trace信息,对应的组件为iogame
lrwh commented 9 months ago
  1. 客户端通过 websocket 发出 connect,服务端 netty 接收后,解码器为io.netty.handler.codec.http.DefaultHttpRequest,同时采用了解码器io.netty.handler.codec.http.LastHttpContent$1

NettyChannelHandlerContextInstrumentation 会产生一个 span 信息,所以我们能够看到一个 span

  1. 客户端调用 send,探针埋 header 信息,服务端 netty 接收后,解码器为 io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame ,无法解出 header 信息

  2. 后进入 com.alipay.remoting.rpc.RpcServerRemoting,相当于上一步数据被封装了,所以当前也是无法提取到 header 信息

    • decoder com.alipay.remoting.rpc.protocol.RpcProtocolDecoder
    • encoder com.alipay.remoting.codec.ProtocolCodeBasedEncoder

关于 WebSocket Frame

IETF发布的WebSocket RFC,定义了6种帧,Netty为它们都提供了一个POJO实现。

lrwh commented 9 months ago

目前还无法实现