[eggjs/egg]由于redis服务器网络异常,egg进程被强制退出

2025-11-04 552 views
6

项目里面使用了egg-socket.io,package.json里面的启动命令如下:

EGG_SERVER_ENV=prod egg-scripts start --sticky --port=10006 --daemon

redis服务出现网络异常时,egg会尝试重连几次,但最后连接不上后,egg服务就退出了。 出现异常时的错误日志:

2019-05-29 01:19:51,044 ERROR 30602 nodejs.AbortError: Ready check failed: Redis connection lost and command aborted. It might have been processed. (uncaughtException throw 27 times on pid:30602) at RedisClient.flush_and_error (/datadisk/socket-egg-server/node_modules/redis/index.js:362:23) at RedisClient.connection_gone (/datadisk/socket-egg-server/node_modules/redis/index.js:664:14) at Socket. (/datadisk/socket-egg-server/node_modules/redis/index.js:289:14) at Object.onceWrapper (events.js:315:30) at emitOne (events.js:116:13) at Socket.emit (events.js:211:7) at TCP._handle.close [as _onclose] (net.js:557:12) code: "UNCERTAIN_STATE" command: "INFO" pid: 30602 hostname: VM_4_89_centos

2019-05-29 01:20:09,699 ERROR 30602 nodejs.ECONNRESETError: read ECONNRESET at _errnoException (util.js:992:11) at TCP.onread (net.js:618:25) code: "ECONNRESET" errno: "ECONNRESET" syscall: "read" name: "ECONNRESETError" pid: 30602 hostname: VM_4_89_centos

2019-05-29 01:20:14,318 ERROR 30594 nodejs.ECONNRESETError: read ECONNRESET at _errnoException (util.js:992:11) at TCP.onread (net.js:618:25) code: "ECONNRESET" errno: "ECONNRESET" syscall: "read" name: "ECONNRESETError" pid: 30594

回答

1

启动时 redis 如果连接不通的话是无法启动的。现在 socket-io 多实例部署是强依赖 redis 的,redis 挂了 socket-io 也无法正常使用。

9

redis 挂了就算运行着也没用啊

8

socket.io 启用 Redis 的话,那就是强依赖,无法连通的话,服务将无法工作。所以这里必须连通成功才能启动,否则启动的起来的一个无法工作的服务,更让人困惑。

7

socket.io 启用 Redis 的话,那就是强依赖,无法连通的话,服务将无法工作。所以这里必须连通成功才能启动,否则启动的起来的一个无法工作的服务,更让人困惑。

这次只是云服务器网络异常导致redis连接不上,影响时间本来就不到两分钟,但是是在凌晨,由于服务被强制停止,即使redis网络恢复服务还是不能用。还好这次只是一台,如果是上百台服务因为redis异常被停止问题就更加严重。所以还是觉得强依赖的话不合理,因为有检测机制,至少应该开发人员可以配置才好

1

@bhb4157 明白问题了,是运行时异常退出,并不是启动时异常退出。我来看看怎么解决。

1

@bhb4157 明白问题了,是运行时异常退出,并不是启动时异常退出。我来看看怎么解决。

多谢了,还有就是我后续测试,redis服务关闭确实会导致egg服务退出,退出前会重试连接redis大概30次左右,然后就退出了

3

https://github.com/eggjs/egg-socket.io/pull/55 这个 PR 应可以修复 Redis 断开后,服务退出的问题。

3

同时我发现,socket.io 可以使用 ioredis 的 https://github.com/socketio/socket.io-redis/blob/master/README.md#with-ioredis-client, 所以有办法可以使用 https://github.com/eggjs/egg-redis 来提供 Redis 配置服务。

等我有时间了,我来搞一下这个。

5
egg-socket.io@4.1.6