Как сделать асинхронный http-запрос в php через центры обработки данных
Мы работаем над конвейером сбора событий на основе Kafka, который будет принимать входящее событие через запросы HTTP GET / POST. Он должен иметь возможность получать события как от браузера пользователя, так и от веб-сервера, работающего на Nginx + PHP-FPM. По самой природе требований этот конвейер должен быть гибким, и поэтому мы будем развертывать его в AWS Singapore, в то время как наши клиенты, обслуживающие веб-серверы, находятся в физическом центре обработки данных в Мумбаи, Индия. Мы не хотим вводить задержку из-за этого, поэтому PHP-приложение должно просто запустить запрос и забыть о нем, для начала даже ~5% потерянных запросов - это нормально. Дорога туда и обратно между Мумбаи и Сингапуром составляет около 70 миллисекунд. Какие варианты мы можем использовать:-
- Запросы curl или fsockopen с таймаутом ~100 мс - недопустимы
- Использование таких библиотек, как Guzzle или curl-easy - которые внутренне используют только curl, поэтому снова вводит задержку
- Запишите запрос локально в файл и используйте для передачи шину типа Flume или Kafka - по сути, мы будем тиражировать равномерный конвейер сбора данных, что увеличит стоимость оборудования.
- Используя рабочую очередь, как механик - не специалист по этому вопросу, поэтому не знаю плюсов и минусов.
- Любая вещь под солнцем при условии ее бесплатности и низких эксплуатационных расходов.
Пожалуйста, предложите.
1 ответ
Я бы использовал систему очереди заданий, хотя она вводит еще один уровень сложности. Это один из самых простых способов асинхронного выполнения действий в PHP, и он гарантированно не займет много времени синхронного процессора.
Вы можете использовать Gearman или ZeroMQ. Они оба очень хорошо поддерживаются в PHP.