Как сделать асинхронные запросы, используя HTTPoison?

Фон

У нас есть приложение, которое обрабатывает значительное количество запросов в секунду. Это приложение должно уведомить внешнюю службу, сделав вызов GET через HTTPS на один из наших серверов.

Задача

Цель здесь - использовать HTTPoison для выполнения асинхронных запросов GET. Меня не волнует ответ на запросы, все, что мне нужно, это знать, если они потерпели неудачу или нет, поэтому я могу записать любые возможные ошибки в регистратор.

Если это удастся, я не хочу ничего делать.

Исследование

Я проверил официальную документацию на HTTPoison и вижу, что они поддерживают асинхронные запросы:

https://hexdocs.pm/httpoison/readme.html

Однако у меня есть 2 проблемы с этим подходом:

  1. Они используют flush чтобы показать, что запрос был выполнен. Я не могу войти в приложение и вручную flush чтобы увидеть, как идут запросы, это было бы безумием.
  2. Они не показывают какой-либо механизм уведомлений, когда мы получаем ответы или ошибки.

Итак, у меня есть простой вопрос:

  1. Как получить асинхронное уведомление о том, что мой запрос не прошел или был выполнен успешно?

Я предполагаю, что по умолчанию 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 Я указал здесь.

Надеюсь, это поможет!

Другие вопросы по тегам