Как сделать асинхронные запросы, используя HTTPoison? - PullRequest
0 голосов
/ 14 января 2019

Фон

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

Цель

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

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

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

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

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

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

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

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

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

Я предполагаю, что по умолчанию HTTPoison.get является синхронным, как показано в документации.

1 Ответ

0 голосов
/ 14 января 2019

Этого можно достичь, создав новый процесс для каждого запроса. Рассмотрим что-то вроде:

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 Я указал здесь.

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

...