Обрабатывать запрос и возвращать ответ порциями

#laravel #request #response #jobs

#laravel #запрос #ответная реакция #Вакансии

Вопрос:

Я создаю агрегатор поиска, и мне было интересно, как я мог бы улучшить производительность поиска.

Учитывая, что я получаю результаты с разных веб-сайтов, в настоящее время мне нужно дождаться получения результатов для каждого поставщика, но это делается один за другим, поэтому для ответа на весь запрос требуется некоторое время.

Самым простым решением было бы просто сделать запрос от клиента для каждого поставщика, но это привело бы к большому количеству запросов на поиск (но если это правильный способ, я просто сделаю это.)

Мне было интересно, есть ли способ возвращать результаты каждый раз, когда поставщик отвечает, поэтому, если у нас есть поставщики A, B и C и B, которые уже вернули результаты, отправьте их обратно клиенту. Конечно, для того, чтобы это сработало, все поисковые запросы должны выполняться параллельно.

Знаете ли вы способ сделать это?

Я пытаюсь создать интерфейс поиска, аналогичный SkyScanner, который загружает результаты, но затем вы можете видеть, что он по-прежнему продолжает получать больше записей и сортирует их на лету (на стороне клиента, насколько я могу видеть).

Ответ №1:

Ключевым моментом здесь является кэширование. Лучшая практика для внешнего 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/

На стороне клиента вы могли бы просто сделать несколько вызовов своей собственной службы в отдельных запросах, и это дало бы вам то асинхронное ощущение, которое вы ищете.

Комментарии:

1. Да, SkyScanner был всего лишь примером, но он применяет то, что вы говорите: шансы двух совпадающих записей невелики, учитывая, что для поиска требуется множество элементов, поэтому это может помочь, но не решит проблему. Мой вопрос был больше о том, как (если возможно) отправлять ответ по частям, когда я получаю результаты от каждого поставщика

2. @KennyHorna любой, кто это делает, делает это, отправляя несколько запросов.

3. @KennyHorna Вы могли бы либо отправить их все сразу, и показывать результаты каждого из них по мере их поступления, либо отложить запросы на несколько секунд каждый. Или, если вы хотите инициировать результаты с сервера, вы можете использовать такую службу, как Pusher.

4. Ах, мне нравится альтернатива Pusher, я не думал об этом варианте