ioGame icon indicating copy to clipboard operation
ioGame copied to clipboard

网关集群重启后其他服务组网异常

Open LucaLq opened this issue 2 years ago • 3 comments

测试了下17.1.42版本,网关重启后,网关之间的组网没问题了,#132

测试过程中另外发现了下面几个问题:

版本: 17.1.42 环境:三个网关,一个对外,一个逻辑 可直接使用文档中的例子复现https://www.yuque.com/iohao/game/qmo56c#Ts1GN

  1. 网关集群依次关闭后,对外服和逻辑服上log的网关数量跟实际不符
复现步骤:

a. 依次启动DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202,DemoClusterExternalTest,DemoClusterLogic
b. 关闭DemoClusterGate10200,等待逻辑服输出“broker (游戏网关)的机器减少”后再关闭DemoClusterGate10201,等待逻辑服输出“broker (游戏网关)的机器减少”后最后关闭DemoClusterGate10202
c. 观察对外服和逻辑服日志,发现最后一台网关10202关闭后,对外服和逻辑服没有输出网关掉线的日志

14:19:03.922 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:131) - broker (游戏网关)的机器减少了 address : 10.8.8.251:10200
14:19:03.922 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:142) - 当前网关数量 : 2 [10.8.8.251:10201, 10.8.8.251:10202]
14:19:18.112 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:131) - broker (游戏网关)的机器减少了 address : 10.8.8.251:10201
14:19:18.112 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:142) - 当前网关数量 : 1 [10.8.8.251:10202]

  1. 集群启动后,同时关闭所有网关,对外服和逻辑服没有任何网关变动的日志
复现步骤:

a. 依次启动DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202,DemoClusterExternalTest,DemoClusterLogic
b. 快速关闭DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202(这里的操作和问题一不同,需要同时关闭所有网关)
c. 观察对外服和逻辑服日志,没有输出任何网关减少的日志
d. 启动DemoClusterWebsocketClient,客户端卡住,对外服和逻辑服没有任何异常日志
  1. 网关集群关闭后再次启动,对外服和逻辑服出现连接网关异常的错误
复现步骤:

a. 依次启动DemoClusterGate10200,DemoClusterExternalTest,DemoClusterLogic
b. 重启DemoClusterGate10200
c. 观察对外服和逻辑服日志,出现连接10200异常的日志,但观察DemoClusterGate10200发现对外服和逻辑服数量没问题
d.启动DemoClusterWebsocketClient,请求正常处理。

实际应该是重连成功了,网关日志已经看到逻辑服,并且客户端请求也能正常处理,这个错误看起来像是gossip服务早于10200网关服务启动的原因?
  1. 将集群种子列表改为一个,重启网关后,对外服和逻辑服log的网关信息异常
复现步骤:

a. 将DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202中的seedAddress改为
List<String> seedAddress = List.of("127.0.0.1:30056");
b. 依次启动DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202,DemoClusterExternalTest,DemoClusterLogic
c. 依次关闭DemoClusterGate10200,等逻辑服输出网关减少日志后再关闭DemoClusterGate10201,等逻辑服输出网关减少日志后再启动DemoClusterGate10200
d.观察逻辑服和对外服日志,网关信息和实际不符,实际有10200和10202,但日志中只有10200

14:37:39.700 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:131) - broker (游戏网关)的机器减少了 address : 10.8.8.251:10200
14:37:39.700 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:142) - 当前网关数量 : 2 [10.8.8.251:10201, 10.8.8.251:10202]
14:37:52.741 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:131) - broker (游戏网关)的机器减少了 address : 10.8.8.251:10201
14:37:52.742 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:142) - 当前网关数量 : 1 [10.8.8.251:10202]
14:37:57.064 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:131) - broker (游戏网关)的机器减少了 address : 10.8.8.251:10202
14:37:57.065 [BrokerClusterMessageClientProcessor0] INFO  .game.common.kit.log.IoGameLoggerFactory.remove (BrokerClientManager.java:142) - 当前网关数量 : 1 [10.8.8.251:10200]

LucaLq avatar May 29 '23 06:05 LucaLq

大概看了下, 1 对不上是因为网关全关闭了,没有网关给逻辑服通信了,所以造成最后一台网关关闭时对不上;可以通过 Shutdown Hook 来做这个事情,但目前觉得没必要。

虽然这样打印的信息不对,但实际上数量是正确的;我们可以在 CloseConnectEventClientProcessor 打印日志来观察,因为 CloseConnectEventClientProcessor 的消息是实时的。

public class CloseConnectEventClientProcessor implements ConnectionEventProcessor, BrokerClientItemAware {
    ...... 省略部分
    @Override
    public void onEvent(String remoteAddress, Connection conn) {
        if (IoGameGlobalConfig.openLog) {
            log.info("网关断开:{} ,连接网关数量 : {}", remoteAddress, brokerClientManager.countActiveItem());
        }
    }
}

iohao avatar Jun 01 '23 01:06 iohao

大概看了下, 1 对不上是因为网关全关闭了,没有网关给逻辑服通信了,所以造成最后一台网关关闭时对不上;可以通过 Shutdown Hook 来做这个事情,但目前觉得没必要。

虽然这样打印的信息不对,但实际上数量是正确的;我们可以在 CloseConnectEventClientProcessor 打印日志来观察,因为 CloseConnectEventClientProcessor 的消息是实时的。

public class CloseConnectEventClientProcessor implements ConnectionEventProcessor, BrokerClientItemAware {
    ...... 省略部分
    @Override
    public void onEvent(String remoteAddress, Connection conn) {
        if (IoGameGlobalConfig.openLog) {
            log.info("网关断开:{} ,连接网关数量 : {}", remoteAddress, brokerClientManager.countActiveItem());
        }
    }
}

是的,实际数量正确。1和2应该是相同的问题,优化下日志输出就ok。集群环境的波动还是挺重要的,每个实例的上下线最好都有对应的日志输出。。

LucaLq avatar Jun 01 '23 02:06 LucaLq

大概看了下, 1 对不上是因为网关全关闭了,没有网关给逻辑服通信了,所以造成最后一台网关关闭时对不上;可以通过 Shutdown Hook 来做这个事情,但目前觉得没必要。 虽然这样打印的信息不对,但实际上数量是正确的;我们可以在 CloseConnectEventClientProcessor 打印日志来观察,因为 CloseConnectEventClientProcessor 的消息是实时的。

public class CloseConnectEventClientProcessor implements ConnectionEventProcessor, BrokerClientItemAware {
    ...... 省略部分
    @Override
    public void onEvent(String remoteAddress, Connection conn) {
        if (IoGameGlobalConfig.openLog) {
            log.info("网关断开:{} ,连接网关数量 : {}", remoteAddress, brokerClientManager.countActiveItem());
        }
    }
}

是的,实际数量正确。1和2应该是相同的问题,优化下日志输出就ok。集群环境的波动还是挺重要的,每个实例的上下线最好都有对应的日志输出。。

好的,后续版本做这部分的日志增加

iohao avatar Jun 01 '23 05:06 iohao