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);
}
}