当前位置:网站首页>flask项目celery使用redis sentinel中遇到的坑

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

2022-07-23 05:45:00 Sindweller5530

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
解决方案

@app.teardown_appcontext
def shutdown_session(exception=None):
    db.session.remove()

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

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

一开始直接设置REDIS_URL = "sentinel://:[email protected]: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 = FlaskRedis(app)
redis_client = Sentinel([('localhost', 26379)], socket_timeout=1, sentinel_kwargs={
    'password': 'password'})
print(redis_client.discover_master("mymaster"))
# 打印结果示例: 
# ('10.1.1.1', 6379)
# redis使用举例

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

BROKER_URL = "sentinel://:[email protected]:26379/1"
BROKER_TRANSPORT_OPTIONS = {
    
    'master_name': 'mymaster',
    'socket_timeout': 1,
    'sentinel_kwargs': {
    'password': 'password'}
}
CELERY_RESULT_BACKEND = "sentinel://:[email protected]:26379/2"
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = BROKER_TRANSPORT_OPTIONS
原网站

版权声明
本文为[Sindweller5530]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Sindweller5530/article/details/120037149