-1

我的项目中有以下堆栈:

项目结构

Cronjobs 每 15 分钟运行一次,以使用来自 API 的数据填充 MySQL 数据库。同时,flask 应用程序会呈现这个日期。因此,每次用户访问网站时,都会加载包含大量数据的表。向数据库发出请求以加载数据。数据将作为响应显示在引导表中。

我希望用户能够刷新表数据(通过单击refresh按钮)并始终查看最新数据(而不必等待 cronjob 重新启动和更新数据库)。如果我在用户点击按钮时再次触发从 API 导入数据refresh,该操作将非常耗时,并且整个数据将加载几分钟才能再次显示页面。刷新从数据库加载的表数据的最佳方法是什么?

4

1 回答 1

0

这个问题可以通过支持锁定的任务队列轻松解决,例如huey(如果你想要一些简单的东西)。

让我们调用获取 API 并更新本地数据库的任务fetch_api():它可以由 cron 或用户运行。

  1. 当它运行时,首先它会获得一个特定的,这意味着只有一个fetch_api()任务实例可以并发运行。
  2. 接下来是检查上次成功运行任务并更新本地数据库的时间。如果它在给定的时间间隔内,例如距离上次导入 1 分钟,那么它会跳过,因为数据可以被视为“新鲜”的,因此无需再次更新。
  3. 否则,它将启动导入过程并更新本地数据库。
  4. 最后它发出一个信号,表示新数据准备就绪。
  5. 客户端通过轮询或 websocket 检测信号并获取新的渲染表。

这样,当用户单击刷新按钮时,fetch_api()可以将任务排入队列,任务运行器将处理其余部分。关键是锁定,因此只有一个任务会获取 API。

于 2022-01-30T14:25:10.727 回答