Эликсир: топология GenStage
В целях самообразования я стараюсь выучить эликсир и обернуть голову вокруг GenStage
библиотека.
Я прочитал документацию и получил ее по большей части, однако у меня есть пара вопросов для моего конкретного домена.
Я пытаюсь построить веб-скребок, который должен запускаться несколько раз в день, а также выполнять некоторые операции очистки и последующей обработки.
Первый вопрос
Итак, мой лучший производитель Stage
который делает HTTP-запросы и передает их потребителям.
Как мне справиться с "ждать 6 часов" здесь?
Должен ли я просто принять требования, но отправлять пустые события потребителям? Это звучит как пустая трата циклов процессора.
Может быть, GenStage
не правильный подход для такого рода событий?
Второй вопрос
Иногда мне нужно вернуть событие обратно в цепочку.
ProducerConsumerA
загружает страницу #nProducerConsumerB
анализирует страницу и генерирует события для элементов, найденных на странице, следующим потребителям. Но это также должно отправить событие дляProducerConsumerA
для следующей страницы (если результаты разбиты на страницы)
1 ответ
Я лично чувствую, что GenStage может быть немного излишним для того, что вы пытаетесь сделать. Особенно, если ваш единственный соскоб каждые 6 часов. Кроме того, если вы только изучаете эликсир, вы можете начать с более простого подхода. Вы всегда можете выполнить рефакторинг позже, если считаете, что вам нужно больше контроля потока.
Я хотел бы создать один основной GenServer, который выполняет очистку поочередно. Вы можете начать это со списка сайтов, чтобы очистить, и заставить это работать хотя список. После того, как сайт был выбран, вы можете начать Task
обработать данные и затем выбрать следующий сайт, начиная новую обработку Task
каждый раз.
Когда вы закончите списывать все сайты, вы можете использовать Process.send_after
отправить сообщение пробуждения, которое запустит следующий цикл очистки.
Это даст вам хорошее представление об эликсире и OTP. После того, как все это заработает, вы сможете продолжить исследование GenStage.