首页 > 解决方案 > 实时拉取API数据并发布

问题描述

关于我正在工作的网站的信息:

与足球实时比分相关的网站

API 提供足球比分的实时数据(他们没有 webhook)

我想要的是:

想在前端传递实时分数

另外,我想暂时将这些数据保存在 Redis 中,并且在比赛结束后,想从 Redis 推送到数据库。

最好不要使用任何外部 JS 库(http://socket.io)、推送器等。Laravel 广播+ Redis 是我的首选方式,因为我不需要推送器或套接字 js 代码来加载。

这个问题的一部分:

第 1 部分:将外部 API 数据拉入数据库(或 Redis)。--> 到目前为止,我设法将数据从 API 提取到数据库的唯一方法是,我创建了一个路由,该路由将触发从外部 API 加载数据。再说一次,到目前为止这没什么用,因为 API 中的实时比分数据几乎每秒更新一次,到目前为止,我需要触发路由(或每秒刷新 URL)只是为了从 API 中提取数据。另外,不要忘记,将 API 数据完全传输到数据库至少需要 2-3 秒。此部分不取决于是否仅在用户(前端正在请求)时拉取。即使有 0 个用户在线,它也应该完成它的工作。

所以,我的问题是实时提取 API 数据并将其保存在 Redis 中直到比赛结束的最佳、最有效和完整的方法是什么?(我们可以通过查看 API 数据示例来了解比赛的状态:{match_id{status:finished}}xxxx)。因为匹配完成后,我会将 Redis 推送到数据库中。

第 2 部分:从数据库(或 Redis)实时发布数据。-> 好吧,这对我来说比第 1 部分要容易得多,我已经找到了通过 pusher 和 socket.io 实时发布 Redis 数据的方法。但除此之外,在我的场景中最好的方法是什么?另外,如果我必须使用 Redis + Laravel 广播的组合,我是否需要任何 JS 库?

谢谢你的建议!

标签: phplaravelredissocket.io

解决方案


第 1 部分的可能答案:

我会使用任务调度->daily();Artisan 控制台命令来检查下一场足球比赛的时间并在表中写入记录->hourly();,或者更新现有记录以防开始/结束时间发生变化。matches

每隔几秒钟执行一次的另一个控制台命令->cron('* * * * *');(更改为所需的秒数)可以检查matches表;如果当前时间在starts_at和之间ends_at,则检索实时数据。

为了防止同时执行多个命令(如果由于某种原因 API 调用需要更长的时间),可以使用Symfony 的Lockable Trait 。


推荐阅读