大约 1 个月前,我开始在 Heroku 上托管 Redis/Celery/Python(Dash) 应用程序。这次它工作得完美无缺,但是在我的最新更新中,我的数据存储凭据发生了变化,并且以某种方式引入了新的错误。
每次我重新启动 dyno 时都会发生这种情况,因为我收到以下错误大约 5 分钟。
错误是:
kombu.exceptions.OperationalError: Error 8 connecting to ec2-44-208-193-34.compute-1.amazonaws.com:19130. EOF occurred in violation of protocol (_ssl.c:1129).
不知何故,大约 5 分钟后,错误自行解决并消失。
我的代码看起来像
celery_app = Celery(
__name__,
broker = "rediss://:*@ec2-44-208-193-34.compute-1.amazonaws.com:19130/0",
backend = "rediss://:*@ec2-44-208-193-34.compute-1.amazonaws.com:19130/1",
broker_use_ssl = {
'ssl_cert_reqs': ssl.CERT_NONE
},
redis_backend_use_ssl = {
'ssl_cert_reqs': ssl.CERT_NONE
}
)
有人知道可能导致这种情况的原因以及如何预防吗?
最佳答案
检查您的 Heroku addon is running 是哪个 Redis 版本,v6 进行了更改,耗尽最大连接池不会导致“达到最大客户端数量”类型的错误,而是导致 TLS 错误。
当部署发生时,现有的测功机正在使用一些基线加上连接流量计数,而替换测功机尝试选取新的测功机,但被 Redis 拒绝。
它在一段时间后自行修复的原因是 Redis 的 timeout 设置,默认情况下通常为 300 秒。 300 秒后所有旧的 dyno 连接都会被清理,然后所有超过最大客户端数的 TLS 连接问题都会消失。
您可以降低超时来减少错误发生的持续时间,但更好的解决办法是通过 Redis 计划增加最大连接数,或减少 Celery 正在使用的连接数(这是一个复杂的主题),希望是 this 和this 有帮助。
令人沮丧的是,如果您查看 Redis 统计数据,Heroku 根本不会报告您超出了限制。它没有显示您突然尝试将客户端连接加倍或更多的迹象。这是一种误导,因为它从未真正被打开过,而是被彻底拒绝,速度如此之快,以至于没有被考虑在内。更糟糕的是,当该错误是资源耗尽问题时,它很难被掩盖为 SSL 问题。
关于heroku - 重新启动 Heroku Dynos 会导致 Redis SSL 连接错误 5 分钟,直到自行解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73022890/