@Mozzart-live

Как организовать многопоточное обращение к сторонним API?

Коллеги, добрый день!

Пишу сервис, который обращается к десятку различных API, требует от них данные, получает их и обрабатывает.
Проблема во времени на ответ от каждого API.

Как грамотнее всего реализовать подобную многопоточность, при учете, что нужно дождаться, пока все сервисы не ответят, затем обработать всю информацию в совокупности и отдать результат пользователю?
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
bigton
@bigton
Web-программист
Допустим, вы создаете новый уникальный сервис по поиску дешевых авиабилетов ;)

Интерфейс

1. Пользователь заходит на страницу вашего сервиса, выбирает направление (city) и дату вылета (date), нажимает Найти.
2. Оправляется AJAX POST запрос на /search.php {city, date}, который возвращает ID запроса (request_id).
3. Каждые 1-5 секунд отправляется AJAX GET запрос на /search.php?check=request_id, который возвращает процент готовности ответа (0-100%).
4. Когда готовность достигает 100%, отправляется AJAX GET запрос на /search.php?result=request_id который возвращает информацию о найденных билетах.

/search.php

1. Создание очереди заданий на запрос к авиакомпаниям

- создание ID запроса
$request_id = INSERT INTO `request` (`city`, `date`) VALUES (city, date);

- создание очереди заданий на получение информации по билетам
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 1, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 2, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 3, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 4, 0);

2. Проверка готовности ответа

SELECT COUNT(*) FROM `request_task` WHERE `request_id` = request_id AND `status` > 0;

3. Информация о найденных билетах

SELECT * FROM `request_result` WHERE `request_id` = request_id

/task.php

Суть: выбрать из очереди заданий одну задачу и выполнить ее. Скрипт нужно запускать несколько раз в секунду в зависимости от нагрузки на сервис

1. Забронировать задачу на выполнение

$process = ip2long($_SERVER['SERVER_ADDR']).'.'.getmypid().'.'.microtime(TRUE);

UPDATE `request_task` SET `process` = $process WHERE `status` = 0 LIMIT 1;

2. Получить забронированную задачу

SELECT * FROM `request_task` WHERE `process` = $process

3. Обратится к нужной авиакомпании

if (airline_id == 1) запрос к Аэрофлоту

4. Положить результат обращения в `request_result`

5. UPDATE `request_task` SET `process` = 0, `status` = 1 WHERE `process` = $process

Таким образом реализуется многопоточность!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы