iohao / ioGame

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

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

Closed fumengame closed 4 months ago

fumengame commented 4 months ago

你的问题 | 使用场景

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

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

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

版本

iohao commented 4 months ago

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

fumengame commented 4 months ago

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

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

fumengame commented 4 months ago

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

fumengame commented 4 months ago

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

fumengame commented 4 months ago

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

iohao commented 4 months ago

好的

iohao commented 4 months ago

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

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

https://github.com/iohao/ioGame/blob/d8f597f040fa7eab28f38d8bb3dfa7a4e4f56ba5/common/common-core/src/main/java/com/iohao/game/action/skeleton/eventbus/EventSubscribe.java#L54-L77