背景介绍
我有大约 150 个脚本,它们直接或间接地从我无法控制的 IBM Cognos 实例中提取数据。我无法访问 Cognos API,因此这些脚本的所有数据的最终来源是模拟以普通用户身份登录的 Web 浏览器来运行和下载报告。这很慢(根据报告的不同,需要 5 秒到 90 秒)。以前,这是通过 Perl 脚本完成的,每次有人想要下载不同的报告时,该脚本都会重复执行。这意味着我们的代码重复性很高,而且经常在报告不再使用后每天仍在下载报告。我编写了一个微服务来从 Cognos 下载任意报告,以尝试替换所有 Perl 脚本。您向指示所需报告的 URL 发出 HTTP GET 请求,微服务模拟浏览器下载报告,然后您会得到 CSV 或 JSON 文件(取决于您请求的文件)。这对于降低复杂性非常有用,因为每个脚本都可以在需要报告的位置上方的一两行中请求报告中的数据。当不再需要报告时,所有需要清理的事情都显而易见。我们也不再需要同步时间表(例如:Perl 脚本在 7:30 下载数据,Python 在 7:35 处理数据)。
具体问题
许多报告的计算量很大,我最近收到了 Cognos 服务器管理员发来的一封群发电子邮件,内容基本上是“不要一遍又一遍地运行相同的报告,尝试在非高峰时段运行报告”。对我们来说,非高峰时段是深夜。许多脚本执行的任务应该在人们在办公室时发生(例如:我们有一个脚本会向特定人员发送电话),因此在许多情况下我无法调整脚本的运行时间。在所有情况下,最多 24 小时的数据都可以。
我的想法是,由于每个报告都只是一个 HTTP GET 请求,所以我可以在微服务前面放置一个缓存。但问题是,虽然我们每天运行相当多的报告,但大多数报告每天只运行一次。对于我所知道的大多数 HTTP 缓存,这会导致每个请求都是缓存未命中。
我希望发生以下情况:第一次对某个 URL 发出请求时,缓存未命中。该 URL 从微服务下载并传递给客户端。然后服务器知道它可以再次看到对该 URL 的请求,因此在非高峰时段它会刷新缓存。第二天当脚本对同一 URL 发出请求时,缓存命中,并立即返回响应。如果某个 URL 在一段时间内未被命中,缓存会将其从每晚要刷新的 URL 列表中删除。
普遍的问题
基本上,我正在寻找一个 HTTP 缓存,它可以了解哪些 URL 将被访问,并在请求之前下载它们。这样的功能已经存在了吗,还是我必须自己编写?
答案1
许多脚本都会执行人们在办公室时应该执行的操作(例如:我们有一个脚本会向特定人员发送电话),因此在很多情况下我无法调整脚本运行的时间。在所有情况下,最多 24 小时的数据都可以。
将数据收集与行动分离。
- 在夜间某个时间获取数据,比如 0315。(非整点时间可能不那么繁忙。)
- 处理数据、生成报告等等。
- 安排任何延迟的行动,比如说在 0800。如果您已经以任何方式执行此操作,请在 UNIX 或 Linux 机器上考虑
at
作业。
我的想法是,由于每个报告都只是一个 HTTP GET 请求,所以我可以在微服务前面放置一个缓存。但问题是,虽然我们每天都会运行很多报告,但大多数报告每天只运行一次。对于我所知道的大多数 HTTP 缓存,这会导致每个请求都是缓存未命中
如果您打算(滥用)使用 HTTP 作为缓存,请仔细查看缓存软件的选项。例如,Squid 可以强制不合规地覆盖过期时间。然后您的脚本可以在夜间获取数据,但可能会丢失,而当您真正需要它时,可以再次获取数据。
这里的棘手之处在于设置一个缓存时间,让命中和未命中的时间随心所欲。就我个人而言,将数据收集和操作计划分离似乎是一个更简洁的解决方案。