正如记录的那样Google Code 上的一个问题当 Redis pubsub 客户端无法跟上向频道发布消息的速度时,Redis 会为该客户端维护不断增长的消息积压,随着时间的推移会使用越来越多的内存。
我想检测这种情况何时发生并收到警报,或者至少能够检查哪些 pubsub 订阅者有积压以及积压量有多大。有办法做到这一点吗?
答案1
错误描述https://code.google.com/archive/p/redis/issues/525不再存在。虽然没有记录在案的方法可以提前警告 PubSub 客户端无法跟上,但 Redis 会终止来自慢速客户端的连接,以防止内存耗尽,并通过其日志文件通知您。文档:
输出缓冲区限制
... 客户端可能会发送更多命令,从而产生更多输出,以便 Redis 能够以更快的速度将现有输出发送到客户端。对于 Pub/Sub 客户端来说尤其如此,因为客户端无法足够快地处理新消息。
[这] 将导致客户端输出缓冲区增长并消耗越来越多的内存。出于这个原因,Redis 默认为不同类型的客户端设置输出缓冲区大小限制。达到限制后,客户端连接将关闭,并且事件将记录在 Redis 日志文件中。
Redis 使用两种限制:
硬限制是一个固定的限制,一旦达到该限制,Redis 将尽快关闭客户端连接。
软限制是一个取决于时间的限制,例如每 10 秒 32 兆字节的软限制意味着如果客户端的输出缓冲区连续 10 秒大于 32 兆字节,则连接将被关闭。
不同类型的客户端有不同的默认限制:
...
- Pub/Sub 客户端的默认硬限制为每 60 秒 32 兆字节,软限制为每 60 秒 8 兆字节。
...
可以使用 CONFIG SET 命令在运行时更改限制,或使用 Redis 配置文件 redis.conf 永久更改限制。有关如何设置限制的更多信息,请参阅 Redis 发行版中的示例 redis.conf。