Как сделать асинхронные запросы, используя HTTPoison?
Фон
У нас есть приложение, которое обрабатывает значительное количество запросов в секунду. Это приложение должно уведомить внешнюю службу, сделав вызов GET через HTTPS на один из наших серверов.
Задача
Цель здесь - использовать HTTPoison для выполнения асинхронных запросов GET. Меня не волнует ответ на запросы, все, что мне нужно, это знать, если они потерпели неудачу или нет, поэтому я могу записать любые возможные ошибки в регистратор.
Если это удастся, я не хочу ничего делать.
Исследование
Я проверил официальную документацию на HTTPoison и вижу, что они поддерживают асинхронные запросы:
https://hexdocs.pm/httpoison/readme.html
Однако у меня есть 2 проблемы с этим подходом:
- Они используют
flush
чтобы показать, что запрос был выполнен. Я не могу войти в приложение и вручнуюflush
чтобы увидеть, как идут запросы, это было бы безумием. - Они не показывают какой-либо механизм уведомлений, когда мы получаем ответы или ошибки.
Итак, у меня есть простой вопрос:
- Как получить асинхронное уведомление о том, что мой запрос не прошел или был выполнен успешно?
Я предполагаю, что по умолчанию HTTPoison.get
является синхронным, как показано в документации.
1 ответ
Этого можно достичь, создав новый процесс для каждого запроса. Рассмотрим что-то вроде:
notify = fn response ->
# Any handling logic - write do DB? Send a message to another process?
# Here, I'll just print the result
IO.inspect(response)
end
spawn(fn ->
resp = HTTPoison.get("http://google.com")
notify.(resp)
end) # spawn will not block, so it will attempt to execute next spawn straig away
spawn(fn ->
resp = HTTPoison.get("http://yahoo.com")
notify.(resp)
end) # This will be executed immediately after previoius `spawn`
Пожалуйста, посмотрите на документацию spawn/1
Я указал здесь.
Надеюсь, это поможет!