从数据库中检索最新数据并将其呈现在网站上的最佳实践

Best practices for retrieving the most recent data from a database and presenting it on a website

我的项目中有以下堆栈:

Project Structure

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

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

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

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

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

这样当用户点击刷新按钮时,一个 fetch_api() 任务可以被加入队列,任务 运行 将处理剩下的事情。关键是锁定,所以只有一个任务会获取 API.