flask项目celery中报错Can’t reconnect until invalid transaction is rolled back
发现是celery的程序中有一处db.session.commit()
没有处理异常,添加try except InvalidRequestError
和db.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://: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 = 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://: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