在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返回存储在指定键中的对象闲置的秒数(没有受到读写操作请求)。