кто сталкивался с подобным.
Есть GenServer, у которого есть имплементация handle_cast(), который на вход принимает сообщение (обычная строка). В теле этого handle_cast генерируется процесс (обычный spawn/1) и pid этого процесса сохраняется в состоянии GenServer-а. Генерируемый процесс содержит всего всего одну строчку кода - вызов HTTPoison в режиме стрима с передачей полученной на вход строки в качестве аргумента и stream_to в виде pid данного GenServer-а.
Логика такая: в генсверере, через handle_cast генерим процесс на стрим данных, которые ловим через handle_info. Когда пропадает необходимость - убиваем сохраненный в состоянии процесс по pid-у.
В чем загвоздка: Когда spawn-ом генерится процесс - он не шлет данные в "родительский" GenServer. Но если внутри анонимной функции, передаваемой в spawn добавить
receive do
msg -> msg
end
То все работает.
Мб есть у кого понимание что это за ерунда такая?
а как pid родителя передается
Дело в том, что процесс, который ты спавнишь, умирает, сразу после запуска стрима, убивая сам стрим вместе с собой. Этот receive заставляет его жить пока он сообщение не получит. Но ты какую-то странную вещь делаешь
А как было бы лучше на твой взгляд?
1. Не делать стрим через сообщения. Это серьёзный антипаттерн, потому что у такого подхода нет backpressure, и какой-нибудь сломанный сервер положит твоё приложение огромным ответом на 100500 сообщений, которые в память не поместятся и обработаться не успеют 2. Не пользоваться HTTPoison 3. Ну если ты всё-таки решил так сделать, то запускать стрим в самом генсервере
1. Что означает "стрим через сообщения"? 2. Что лучшая альтернатива? Mint? И почему? 3. Нет, если есть концептуально более лучшие решения - эт даже лучше
То и означает. Тебе всё, что ответ сервер, прилетит в процесс в виде сообщений, хочешь ты этого или нет. Если сообщения будут прилетать быстрее чем ты их обработаешь, у тебя сервер упадёт Да, выбирай лучше Finch или Mint или Req
Как это можно решить (без добавления всяких месседж брокеров и тп)?
Да просто не делай так и всё
Обсуждают сегодня