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

本文介绍了在Flask+Celery项目中遇到的数据库连接池溢出和Redis配置问题。通过添加异常处理和关闭会话解决SQLAlchemyError,调整数据库连接池大小并实现自动释放连接。同时,详细展示了如何正确配置Celery的Redis Sentinel broker和result backend,包括设置密码和初始化redis_client。最后,提供了错误示例及解决方案。
摘要由CSDN通过智能技术生成

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://: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值