Всем привет. Вопрос по архитектуре.
У меня поступает запрос от браузера пользователя в Laravel-приложение. По этому запросу нужно загрузить из другого источника данные и отдать пользователю.
Запрос поступает скажем в метод AnyController::loadData()
Раньше источник данных был один.
В этом случае я прямо в коде AnyController::loadData() я делал запрос через PHP библиотеку Guzzle к стороннему api, обрабатывал запрос, ошибки и возвращал назад пользователю.
Сейчас источников данных три. Они отвечают с разной скоростью и разной полнотой ответа. При этом есть задача максимально быстро показать пользователю результат, а потом уже догружать данные.
Есть три варианта, но все они работают по одному принципу:
В AnyController::loadData() я создаю идентификатор ответа IDRESPONCE и сразу его возвращаю пользователю в браузер. И тут же параллельно запускаются три задачи на дозагрузку данных. Каждая из этих задач кладет ответ в БД и указывает IDRESPONCE.
А в браузере я поллингом ломлюсь каждую секунду к другому методу AnyController::getNewData(передаю ему IDRESPONCE) и жду появления записей.
Вопрос: как организовать параллельную загрузку данных?
1. PHP PThreads. в методе AnyController::loadData() стартануть три потока и они пусть молотят данные дальше. Но множить потоки на каждый запрос, это стрёмно, откровенно.
2. Queue. в методе AnyController::loadData() кладу в очередь три задачи на загрузку, а дальше их воркеры берут из очереди и обрабатывают. Тут всё отлично, кроме того, что нужна работоспособная очередь и я не знаю насколько это будет быстро.
3. Node.js Реализовать метод AnyController::loadData() не на Laravel а в Node.js. Но тут проблема с CSRF-токеном, не хотелось бы терять его, а в ноду его не прокинешь.