iohao / ioGame

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

网关转发失败没看到重试 #357

Closed Renegade-NIC closed 3 months ago

Renegade-NIC commented 3 months ago

你的问题 | 使用场景

image

源码网关转发消息,基本都是oneway方法,sofabolt官网说该方法不保证成功,我看如果失败,就捕捉异常了,那么这次请求没有重试,是不是消息就丢了呢?

版本

iohao commented 3 months ago

是的,将消息丢弃。

Renegade-NIC commented 3 months ago

丢了,客户端如何知道呢?在请求时转发失败,客户端可重试,但是在逻辑服处理完逻辑响应结果给网关时转发失败了,客户端怎么办呢?

iohao commented 3 months ago

这种偏业务的处理方法很多,比如

  1. 方法一:让客户端给请求添加超时机制,在指定时间后没有收到响应回调的,可以尝试重发。
  2. 方法二:在对外服做扩展,记录玩家的请求,原理同上。

一般建议使用方法一,因为如果在服务器做这种记录,请求数据将会占用更多的内存;因为游戏对外服只做与玩家的连接,可能会有数万或数十万的玩家连接在同一台对外服上;所以在客户端做这些操作是比较合适的,占用玩家的机器资源,从而减少服务器成本。

Renegade-NIC commented 3 months ago

存在重试,意味着逻辑服业务侧需要做幂等处理,刚开始我以为框架都帮忙搞好了呢。 后期考虑以组件试的加这个吗?

iohao commented 3 months ago

可以,欢迎 PR 。