flask项目celery使用redis sentinel中遇到的坑

flask项目celery中报错Can’t reconnect until invalid transaction is rolled back

发现是celery的程序中有一处 db.session.commit()没有处理异常,添加 try except InvalidRequestErrordb.session.rollback()后修复。之前一直是 SQLAlchemyError

celery中的数据库连接池大小限制与连接未释放

QueuePool limit of size 10 overflow 10 reached, connection timed out
已查询完毕使用的数据库连接未释放。
解决方案:自动释放连接。
参考:https://stackoverflow.com/questions/24956894/sql-alchemy-queuepool-limit-overflow

flask项目celery使用redis sentinel中遇到的坑
@app.teardown_appcontext
def shutdown_session(exception=None):
    db.session.remove()

另外再把数据库连接池的大小调大一点。

celery+flask+redis+sentinel带密码如何配置和初始化

一开始直接设置 REDIS_URL = "sentinel://:password@localhost:26379/0"报错:

ValueError: Couldn't import 'app.celery': Redis URL must specify one of the following schemes (redis://, rediss://, unix://)

以为是celery,但这实际上是初始化redis-client出现的问题。
将redis_client的初始化从Flask-redis改为redis.sentinel


redis_client = Sentinel([('localhost', 26379)], socket_timeout=1, sentinel_kwargs={'password': 'password'})
print(redis_client.discover_master("mymaster"))

这样解决了redis,那么之后解决celery的broker和result backend的配置
(mymaster是默认的主集群)

BROKER_URL = "sentinel://:password@localhost:26379/1"
BROKER_TRANSPORT_OPTIONS = {
    'master_name': 'mymaster',
    'socket_timeout': 1,
    'sentinel_kwargs': {'password': 'password'}
}
CELERY_RESULT_BACKEND = "sentinel://:password@localhost:26379/2"
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = BROKER_TRANSPORT_OPTIONS

Original: https://blog.csdn.net/Sindweller5530/article/details/120037149
Author: Sindweller5530
Title: flask项目celery使用redis sentinel中遇到的坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/748068/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球