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 = 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/
转载文章受原作者版权保护。转载请注明原作者出处!