我有一个 Flask 应用程序,它使用 Waitress 作为服务器,并使用 Celery+RabbitMQ(作为代理)+ Redis(作为后端)来执行任务。
我注意到,即使为 Redis 设置了池,我的 Redis 连接数量仍在不断增加。清除它们的唯一方法是终止应用程序(或者在我的 Heroku 例子中,重新启动测功机)。
这是当前代码的示例:
CLOUDAMQP_URL = os.environ.get("CLOUDAMQP_URL") or os.environ.get("RABBITMQ_URL")
HEROKU = os.environ['HEROKU']
if HEROKU == "production":
url = urlparse(os.environ.get('REDISCLOUD_URL'))
backend_url = f"redis://{url.username}:{url.password}@{url.hostname}:{url.port}"
else:
backend_url = "redis://localhost:6379/0"
redis_client = redis.Redis.from_url(backend_url)
broker_url = CLOUDAMQP_URL
app = Celery('chatbot_tasks', broker=broker_url, backend=backend_url)
app.conf.task_serializer = 'json'
app.conf.result_serializer = 'json'
app.conf.broker_pool_limit = 0
什么可能导致此问题?
我尝试建立一个这样的池:
backend_url = os.environ['REDIS_URL']
pool = ConnectionPool.from_url(backend_url)
但没有修复...
由于我不知道是什么原因导致连接增加,设置redis服务器超时可能是一个短期解决方案。配置完成后,所有客户端连接将在配置的空闲时间后关闭。 使用一些 Redis 客户端运行一次:
CONFIG SET timeout <time in seconds>
Redis.from_url() 作为 singleton 有一个错误,请参阅问题:https://github.com/redis/redis-py/issues/2638