在play-redis中出现“PeerClosed”日志的原因是什么?

请寻求答案

Redis.actors.RedisClientActor – ConnectionClosed PeerClosed的Warning日志持续出现在各个API的CloudWatch上(出现频率为每分钟一次)。

造成这种情况的原因是什么?

由于在redis中设置了超时时间,如果在超时时间内没有对redis进行读/写操作,则会切断与redis的连接。因此,如果在每个API中对redis的读/写操作不频繁发生,redis服务器会主动关闭连接,并在play-redis(scala)中生成”PeerClosed”的日志。

应对措施

可以考虑将Redis的超时值设置得更长,或者定期运行读取操作来解决问题。但是,请注意在频繁进行Redis处理的生产环境等环境中,不会发生PeerClosed日志。Redis还设置了其他参数,如输出缓冲区等超过限制时会断开连接,因此需要注意。

对等关闭的日志含义

    https://doc.akka.io/docs/akka/2.5/io-tcp.html#closing-connections

如果连接已由远程端点关闭,将向侦听器发送 PeerClosed 消息。
默认情况下,该连接也将自动从此端点关闭。
要支持半关闭连接,将 Register 消息中的 keepOpenOnPeerClosed 成员设置为 true,在这种情况下,连接保持打开状态,直到接收到上述任一关闭命令为止。

要点:连接已从远程终端断开。

调查ConnectionClosed日志的redis.actors.RedisClientActor部分。

连接关闭日志来自以下rediscala。

    https://github.com/etaty/rediscala/blob/master/src/main/scala/redis/actors/RedisWorkerIO.scala#L107

在play-redis中使用rediscala。

    https://github.com/KarelCemus/play-redis/blob/af4e8ed7bd3ff23d5d3a4f0a3ff946895f5af21b/build.sbt#L28

AWS的ElastiCache服务中的Redis配置

Redis设置了timeout参数,并将值设置为60(默认值)。因此,如果在timeout时间内未发送read/write请求,则连接将被断开。

Redis的特定参数

    https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/ParameterGroups.Redis.html

Redis的超时参数

    https://redis.io/topics/clients

暂停时间的详细信息

超时设置为60,意味着节点会等待一定的秒数,直到断开处于空闲状态的客户端。

    https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/ParameterGroups.Redis.html

节点等待超时的秒数。值如下:
0- 不会断开处于空闲状态的客户端连接。
1-19- 无效的值。
大于等于20- 节点将等待一段时间(秒)来断开处于空闲状态的客户端连接。

据说,”idle”指的是没有读写请求的状态。

    https://redis.io/commands/object

OBJECT IDLETIME返回存储在指定键中的对象闲置的秒数(没有受到读写操作请求)。