Получение результата от асинхронного API
Я создаю API для обработки с помощью Lumen, процесс обработки занимает около 1-3 секунд на запрос.
До сих пор я делал это с помощью очереди заданий и beanstalkd, и это было асинхронно, то есть я возвращал job_id, чтобы позже я мог проверить результат.
Я также пишу PHP-клиент для использования API и для этого мне интересно, должен ли я включить параметр "ждать" на стороне сервера или на стороне клиента? Если ожидание реализовано на стороне сервера, мне нужно будет поспать и проверить базу данных на предмет результатов после отправки задания, а затем вернуть результат, когда он будет доступен (в течение следующих 1-5 секунд до тех пор, пока он не станет доступен), или если это будет на стороне клиента, мне нужно будет спать и проверьте с помощью job_id по определенному маршруту, если работа завершена и получить результаты.
Какой вариант лучше?
1 ответ
Я хотел бы иметь конечную точку, единственной задачей которой является проверка идентификаторов работы и ожидание. Не будет возможности дождаться результата на других конечных точках, поскольку это нарушит асинхронность, потребители просто всегда будут ждать, как это будет проще.
Хорошо, клиент отправит работу и вернет идентификатор работы.
Затем вы отправляете этот идентификатор задания в конечную точку ожидания, конечная точка будет ждать / зависать, пока задание не будет завершено или произойдет сбой. Затем вы можете снова запросить работу и получить результат.
Это предотвратит необходимость опроса сервера, а также предотвратит блокировку в клиенте из-за необходимости спать, опрашивать, спать.
Abit, как конечная точка операций LXD: https://github.com/lxc/lxd/blob/master/doc/rest-api.md#10operationsuuidwait