Skip to main content

请求处理流程

介绍​

这篇文档主要介绍从玩家请求进来,并得到响应结果的整个处理流程。 通过介绍,可以让开发者更好的理解框架是如何处理请求的、如何响应结果的。

请求处理流程时序图​

用户(玩家)请求发出后的处理时序图 An

流程处理步骤如下

  • 【1】玩家发起请求到游戏对外服。
  • 【2】游戏对外服将请求转发给 Broker。
  • 【3】Broker 将请求转发给游戏逻辑服。
  • 【4】请求由 action 处理。
  • 【5】游戏逻辑服将响应结果转发给 Broker。
  • 【6】Broker 将响应结果转发到游戏对外服。
  • 【7】游戏对外服将响应结果转发给玩家。

从玩家发出请求,到玩家接收到响应的流程做了一个大概的介绍。 虽然整个处理流程看起来像是过程化的方式,但实际上每个环节的处理都是独立的,并不是过程化的。

当请求从游戏对外服发送到 Broker(游戏网关)后,两者之间就没有任何联系了。 这就好比你打电话到某个餐厅订外卖,当你挂了电话后就可以去休息了, 直到外卖员按你家门铃时,你才需要动起来。 而按门铃就可比作 Broker(游戏网关)给游戏对外服的响应结果,通讯过程中的每个环节都是如此。

换个角度来看,在响应结果的角度,其实就是【游戏逻辑服】主动的请求【游戏对外服】。 无论是 action 方法的返回值,还是广播数据,两者的本质是一样的,都是向游戏网关发送数据。


响应式

从上面的例子我们可以看出,处理流程类似响应式非阻塞的。 当我们调用一个 action 获取数据时,无需阻塞等待数据返回,而是当有数据返回时会进行告知。 可见我们的处理流程是非阻塞的,意味着调用方法后,CPU 可以去做别的事情, 当接收到数据响应时 CPU 再回来处理,这种方式提高了系统的吞吐量。


这么多的环节,对性能有影响吗?

长连接通信在同一内网中,几乎可以忽略,如果是多服单进程则是在内存中通信传输。

流程环节说明​

p1​

游戏对外服接收到用户的请求后,由 SocketRequestBrokerHandler 将请求转发到 Broker。

public final class SocketRequestBrokerHandler extends SimpleChannelInboundHandler<BarMessage>
implements UserSessionsAware, BrokerClientAware {
@Override
protected void channelRead0(ChannelHandlerContext ctx, BarMessage message) {
...
brokerClient.oneway(message);
}
}

p2​

RequestMessageBrokerProcessor 接收到来自游戏对外服的请求后,再将请求转发到游戏逻辑服。 在这个环节中做了负载均衡相关的,由于一般开发者很少有机会接触这部分的扩展,就不过多介绍了。

p3​

RequestMessageClientProcessor 接收来自 Broker 的请求,将请求交给业务框架处理。

public class RequestMessageClientProcessor extends AbstractAsyncUserProcessor<RequestMessage>
implements BrokerClientAware, UserProcessorExecutorSelectorAware {
@Override
public void handleRequest(BizContext bizCtx, AsyncContext asyncCtx, RequestMessage request) {
FlowContext flowContext = ...
this.requestMessageClientProcessorHook.processLogic(barSkeleton, flowContext);
}
}
tip

开发者可以通过 requestMessageClientProcessorHook 钩子接口来做业务线程编排。

p4​

该环节是 action 处理流程,也就是我们编写的 action。

An

@ActionController(1)
public class DemoAction {
@ActionMethod(0)
public HelloMessage here(HelloMessage message) {
return ...;
}
}

p5​

当业务框架处理完开发者的业务后,将得到的业务结果转发到 Broker, 也就是 DefaultActionCommandFlowExecute 中的第 5 步,将响应结果发送到 Broker。

p6​

ResponseMessageBrokerProcessor 接收到来自游戏逻辑服的响应后,将响应结果转发到游戏对外服。

public final class ResponseMessageBrokerProcessor extends AbstractAsyncUserProcessor<ResponseMessage>
implements BrokerServerAware {
@Override
public void handleRequest(BizContext bizCtx, AsyncContext asyncCtx, ResponseMessage responseMessage) {
...
brokerClientProxy.oneway(responseMessage);
}
}

p7​

ResponseMessageExternalProcessor 接收到来自 Broker(游戏网关)的响应后,将响应数据转发给玩家。

public final class ResponseMessageExternalProcessor extends AbstractAsyncUserProcessor<ResponseMessage>
implements UserSessionsAware {
@Override
public void handleRequest(BizContext bizCtx, AsyncContext asyncCtx, ResponseMessage responseMessage) {
...
userSession.writeAndFlush(responseMessage);
}
}