【问题标题】:How to defer a slow database operation with SQLAlchemy / Python如何使用 SQLAlchemy / Python 推迟缓慢的数据库操作
【发布时间】:2020-12-17 05:14:29
【问题描述】:

我有一个数据库的 REST 接口,用 Python FastAPI + SQLAlchemy 实现。我想对我的数据运行一些(相对)昂贵的操作,例如计算加密哈希或签名。我希望能够:

  1. 执行插入,以便数据库检查所有参照完整性。
  2. 将 REST 响应返回到前端(插入的主键)。
  3. 异步计算代价高昂的哈希/签名/任何东西,并更新到数据库中(同一张表)。

我更喜欢跨数据库解决方案,但似乎在插入/更新时运行触发器可能是可行的方法。如果是这样,我的生产目标是 PostgreSQL。

有人有他们喜欢的建议方法吗?

【问题讨论】:

标签: postgresql rest asynchronous sqlalchemy fastapi


【解决方案1】:

我会尝试将关注点分开。

  • 构建执行第 1 项和第 2 项的快速 REST 服务(关注点:一致的数据持久性);
  • 使用pgAgent 或其他类似方法(关注点:数据“装饰”)创建一个在后台执行第 3 项的计划作业,或使用通知/侦听设置来调用单独的进程。

运行触发器将同步执行操作。据我了解,这不是你的意图。

【讨论】:

  • 您的回答帮助我意识到我错误地假设触发器是异步的,但是,呵呵!它们必须在事务上下文中运行。装饰器是这里模式的完美词。 pgAgent 看起来非常有用!但我试图在这里实现的时间更接近实时。带有独立守护程序侦听器的 pg 侦听/通知可能是一个不错的替代解决方案。
  • 听起来很不错。 after insert or update 触发器仅发出通知(使用pg_notify 函数)并迅速离开,然后守护程序侦听器跳入并完成繁重的工作。我已经编辑了我的答案以包含它。
  • 我认为这是选项的超级组合。我会尝试开发它,以便 pgAgent 也可以调用守护进程,这样如果有任何工作遗漏,它可以按计划作为清理执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2017-11-17
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多