RabbitMQ на беке и long-polling/WebSocket на клиенте.
Вкратце, схема такая: клиент шлет запрос на поиск на бэкенд (в некий диспетчер задач), подписывается на получение результатов (тут используются WebSocket'ы) и собственно ждет их. Диспетчер раскидывает задачи в очередь (RabbitMQ) и умирает. Обработчики (можно горизонтально смасштабировать на n-машин) делают запросы к сторонним API (т.е. полезную работу), получают результат и отдают клиенту.
Кеширование и остальные плюшки добавляются по вкусу.