1

在中高负载(测试和生产)下,使用 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 客户端就变得毫无用处,因为通过客户端对 Redis 的所有进一步调用都会失败,并出现相同的警告,导致处理程序没有被调用。我在客户端上设置了一个异常处理程序来尝试重新连接,但我没有看到任何正在尝试的重新连接。

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

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

4

1 回答 1

2

即将发布的 4.0 版本已经解决了这个问题,并且应该很快就会发布一个版本,多久,我真的不知道。

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

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

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

于 2019-11-26T14:34:23.920 回答