iohao / ioGame

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

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用BrokerClientHelper.getInvokeModuleContext()调用其他逻辑服数据,返回数据出现不在同一个线程中,报timeout错误

fumengame opened this issue · comments

commented

你的问题 | 使用场景

我尝试在所有的模块(逻辑服)加载完毕后,在一个初始化函数中使用BrokerClientHelper.getInvokeModuleContext()调用其他逻辑服数据,返回数据出现不在同一个线程中,报timeout错误。

请求的时候如果目标逻辑服执行在16-3线程,目标逻辑服正常收到消息,但是目标逻辑服返回数据时候,会出现在其他线程例如16-8线程中。这个时候就会出现Rpc invocation timeout[responseCommand TIMEOUT]错误。
如果返回数据也在16-3线程中,那么就会正常返回数据。不过这是几率事情。

这个问题在21.2以及之前都没出现。只有更新到21.2之后出现此问题

版本

  • ioGame version: 21.7

是一个进程中启动了多个逻辑服,还是不同进程中启动了不同的逻辑服。可以提供一个复现 demo 和复现步骤吗。

commented

是一个进程中启动了多个逻辑服,还是不同进程中启动了不同的逻辑服。可以提供一个复现 demo 和复现步骤吗。

是用一个进程启动了多个逻辑服,我大概给你一个复现demo,稍等。

commented

我重新写了个demo的时候,解决了问题,主要有2个原因导致timeout,一个是首次逻辑服通信的时候,超过了3秒目标逻辑服才收到消息开始处理,然后返回数据超时,导致提示RPC响应数据失败。
另一个发送消息在一个线程,返回消息在另一个线程的错误原因是,我在目标逻辑服内使用了事件总线Fire消息。

commented

在@EventSubscribe 订阅时候加上(ExecutorSelector.userExecutor) 问题就解决了。

commented

至于为什么首次逻辑服通信那么久,这应该是另外的问题,我尝试去解决一下,解决不了再提isu

好的

在@EventSubscribe 订阅时候加上(ExecutorSelector.userExecutor) 问题就解决了。

这个是默认策略,不设置也不影响。

public @interface EventSubscribe {
/**
* 执行器策略选择
* <pre>
* 注意,只有在发送异步事件时,该配置才会生效。
* </pre>
*/
ExecutorSelector value() default ExecutorSelector.userExecutor;
/**
* 订阅者的执行顺序(优先级)
* <pre>
* 值越大,执行优先级越高。
*
* 想要确保按顺序执行,订阅者需要使用相同的线程执行器。
* 比如可以搭配 userExecutor、simpleExecutor 等策略来使用。
* 这些策略通过 {@link EventBusMessage#getThreadIndex()} 来确定所使用线程执行器。
* </pre>
*
* @return 执行顺序
* @see ExecutorSelector
*/
int order() default 0;
}