首页 > 解决方案 > 分块处理请求和返回响应

问题描述

我正在做一个搜索聚合器,我一直想知道如何提高搜索的性能。

鉴于我从不同的网站获取结果,目前我需要等待接收每个提供者的结果,但这是一个接一个地完成的,因此整个请求需要一段时间才能响应。

最简单的解决方案是只从客户端为每个提供者发出请求,但这最终会导致每次搜索产生大量请求,(但如果这是正确的方式,我会这样做。)

为什么我一直想知道是否有办法在每次提供者响应时返回结果,所以如果我们有提供者 A、B 和 C 并且 B 已经返回结果,那么将其发送回客户端。为了使其工作,所有搜索当然需要并行运行。

你知道这样做的方法吗?

我正在尝试建立一种类似于 SkyScanner 的搜索体验,它可以加载结果,但是您可以看到它仍然不断获取更多记录,并且它会即时对它们进行排序(据我所知,在客户端)。

标签: laravelrequestresponsejobs

解决方案


缓存是这里的关键。外部 API(或抓取)的最佳实践是尽可能少地成为“接受者”。因此,在您的 Laravel 设置中,获取您的结果,但只要对您的应用程序有意义就缓存结果。虽然在 Skyscanner 的情况下,两个用户发出完全相同的请求的几率很低,但一个用户多次发出相同请求或共享链接等的几率要高得多。

https://laravel.com/docs/8.x/cache

cache(['key' => 'value'], now()->addMinutes(10));

$value = cache('key');

要实际抓取内容,您可以使用以下命令:

https://github.com/softonic/laravel-intelligent-scraper

或者使用更好的 API:

https://docs.guzzlephp.org/en/stable/

在客户端,您可以在单独的请求中对您自己的服务进行几次调用,这会给您带来您正在寻找的异步感觉。


推荐阅读