如何从 "No handler waiting for message" 警告中恢复客户端?

How to recover client from "No handler waiting for message" warning?

在中高负载(测试和生产)下,当使用 Vert.x Redis 客户端时,我在几百次请求后收到以下警告。

2019-11-22 11:30:02.320 [vert.x-eventloop-thread-1] WARN io.vertx.redis.client.impl.RedisClient - No handler waiting for message: [null, 400992, <data from redis>]

因此,提供给 Redis 调用的处理程序(见下文)未被调用,传入请求超时。

Handler<AsyncResult<String>> handler = res -> {
    // success handler
};

redis.get(key, res -> {
    handler.handle(res);
});

真正的问题是,一旦 "No handler ..." 警告出现,Redis 客户端就变得无用了,因为 all 通过客户端对 Redis 的进一步调用失败并显示相同的导致处理程序未被调用的警告。我在客户端上设置了一个异常处理程序来尝试重新连接,但我没有看到任何重新连接尝试。

如何从这个问题中恢复过来?任何减轻严重性的变通办法也很好。

我在 vertx-core 和 vertx-redis-client 3.8.1 上。

即将发布的 4.0 版本已经解决了这个问题,应该很快就会发布,具体要多久,我真的说不准。

问题是我们不能轻易地从 master 分支移植回 3.8 分支,因为客户端发生了重大重构并且代码库非常不同。

新代码使用了一个连接池并且已经过并发访问测试(这就是您所看到的问题的来源)。在负载下,请求被路由到所有事件循环中,并且维护飞行请求(发送到 redis 的请求)和等待处理程序之间状态的队列在非常特殊的情况下会不同步。

所以我首先尝试看看您是否已经可以开始将您的代码移动到 4.0,您可以尝试使用 4.0.0-milestone3 版本,但要完全没问题,只需使用 运行 最新的 master 解决了这方面的更多问题。