Flask-Sqlalchemy 和水平缩放和范围会话
Posted
技术标签:
【中文标题】Flask-Sqlalchemy 和水平缩放和范围会话【英文标题】:Flask-Sqlalchemy and horizontal scaling and scoped session 【发布时间】:2017-11-29 19:52:26 【问题描述】:我在 flask-sqlalchemy 中有应用程序,我想水平扩展
@app.route('/read')
def read():
e = db.session.query(Example).get(1)
return e.value, 200
@app.route('/increase')
def increase():
e = db.session.query(Example).get(1)
e.value += 1
db.session.add(e)
db.session.commit()
return e.value, 200
有两个端点:
读取 - 获取 id = 1 的实体并获取值
increase = 获取 id = 1 的实体并增加值
然后我想水平扩展,flask-sqlalchemy 不会在工作人员之间同步会话。所以即使我增加了工人 2 的价值,也没有办法从工人 1 那里获得实际价值
示例用户请求:
curl GET /read/ [worker-1]
1
curl GET /increase/ [worker-2]
2
curl GET /read/ [worker-1]
1
如您所见,sqlalchemy 不提供自动刷新会话状态的工具。
解决此问题的最佳方法是什么?使用新会话进行新查询?或使用session.refresh(instance)
。推荐的方法是什么?
【问题讨论】:
【参考方案1】:您应该在每次请求后终止会话。 page on SQLAlchemy from the Flask website 提供了这个 sn-p:
from yourapplication.database import db_session
@app.teardown_appcontext
def shutdown_session(exception=None):
db_session.remove()
即便如此,对同一对象的并发编辑也不安全。如果您希望您的选择更新是原子的,则需要更改会话的隔离级别(请参阅this answer)。
【讨论】:
另一个选项是使用 flask-sqlalchemy 是的。 Flask 在我链接的那个页面上也推荐了它。这肯定会解决问题。以上是关于Flask-Sqlalchemy 和水平缩放和范围会话的主要内容,如果未能解决你的问题,请参考以下文章