Flask-Sqlalchemy和横向缩放和范围会话

时间:2017-11-29 19:52:26

标签: python orm sqlalchemy flask-sqlalchemy horizontal-scaling

我在flask-sqlalchemy中的应用程序,我想进行horiontally

@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且获得值的实体

增加=获取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 个答案:

答案 0 :(得分:1)

您应该在每次请求后拆除会话。 page on SQLAlchemy from the Flask website提供了以下代码段:

from yourapplication.database import db_session

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

即使这样,对同一对象的并发编辑也是不安全的。如果您希望select-update是原子的,则需要更改会话的隔离级别(请参阅this answer)。