laravel - 分块处理请求和返回响应
问题描述
我正在做一个搜索聚合器,我一直想知道如何提高搜索的性能。
鉴于我从不同的网站获取结果,目前我需要等待接收每个提供者的结果,但这是一个接一个地完成的,因此整个请求需要一段时间才能响应。
最简单的解决方案是只从客户端为每个提供者发出请求,但这最终会导致每次搜索产生大量请求,(但如果这是正确的方式,我会这样做。)
为什么我一直想知道是否有办法在每次提供者响应时返回结果,所以如果我们有提供者 A、B 和 C 并且 B 已经返回结果,那么将其发送回客户端。为了使其工作,所有搜索当然需要并行运行。
你知道这样做的方法吗?
我正在尝试建立一种类似于 SkyScanner 的搜索体验,它可以加载结果,但是您可以看到它仍然不断获取更多记录,并且它会即时对它们进行排序(据我所知,在客户端)。
解决方案
缓存是这里的关键。外部 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/
在客户端,您可以在单独的请求中对您自己的服务进行几次调用,这会给您带来您正在寻找的异步感觉。
推荐阅读
- linux - 来自 Linux 中 AP(接入点)的客户端列表(站)命令
- kubernetes - 在 GCEPersistentDisk 上使用 nfs 时是否有最佳实践?
- django - 如何在特定组帖子中自动选择组名,我已经完成了经过身份验证的用户自动选择
- android - android中Pagingconfig中的pagesize是什么
- angular - 如何使用角度在静态页面中添加 cookie
- python - 为什么“list_of_letters”的索引不会在每个带有“guessed_letter_string”的while循环中更新?问题出现在 Try: 部分
- javascript - threejs - GL_INVALID_OPERATION:多采样帧缓冲区上的无效操作
- gradle - gradle 7.1.1 没有运行包含的构建或传递的测试?
- c++ - 编译器如何复制数组成员数据?
- docker - 在 Amazon 的 ECS (Fargate) 中运行 dask 调度程序和工作程序