网关集群重启后其他服务组网异常
测试了下17.1.42版本,网关重启后,网关之间的组网没问题了,#132
测试过程中另外发现了下面几个问题:
版本: 17.1.42 环境:三个网关,一个对外,一个逻辑 可直接使用文档中的例子复现https://www.yuque.com/iohao/game/qmo56c#Ts1GN
- 网关集群依次关闭后,对外服和逻辑服上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]
- 集群启动后,同时关闭所有网关,对外服和逻辑服没有任何网关变动的日志
复现步骤:
a. 依次启动DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202,DemoClusterExternalTest,DemoClusterLogic
b. 快速关闭DemoClusterGate10200,DemoClusterGate10201,DemoClusterGate10202(这里的操作和问题一不同,需要同时关闭所有网关)
c. 观察对外服和逻辑服日志,没有输出任何网关减少的日志
d. 启动DemoClusterWebsocketClient,客户端卡住,对外服和逻辑服没有任何异常日志
- 网关集群关闭后再次启动,对外服和逻辑服出现连接网关异常的错误
复现步骤:
a. 依次启动DemoClusterGate10200,DemoClusterExternalTest,DemoClusterLogic
b. 重启DemoClusterGate10200
c. 观察对外服和逻辑服日志,出现连接10200异常的日志,但观察DemoClusterGate10200发现对外服和逻辑服数量没问题
d.启动DemoClusterWebsocketClient,请求正常处理。
实际应该是重连成功了,网关日志已经看到逻辑服,并且客户端请求也能正常处理,这个错误看起来像是gossip服务早于10200网关服务启动的原因?
- 将集群种子列表改为一个,重启网关后,对外服和逻辑服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]
大概看了下, 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 对不上是因为网关全关闭了,没有网关给逻辑服通信了,所以造成最后一台网关关闭时对不上;可以通过 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。集群环境的波动还是挺重要的,每个实例的上下线最好都有对应的日志输出。。
大概看了下, 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。集群环境的波动还是挺重要的,每个实例的上下线最好都有对应的日志输出。。
好的,后续版本做这部分的日志增加