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 和水平缩放和范围会话的主要内容,如果未能解决你的问题,请参考以下文章

数据库中的垂直和水平缩放

Flask-SQLAlchemy精确查询&模糊查询---ORM(1)

任何水平缩放 Spark 的技巧

如何水平自动缩放 Kubernetes 部署

在 UIScrollView 中仅水平缩放 UIView

OpenStack 上 Kubernetes 中节点(minions)的水平自动缩放