ZIO, Начало работы, чисто функциональный загрузчик

У меня есть простая программа, которая более-менее является загрузчиком. Он собирает один или несколько настраиваемых ресурсов (через настраиваемый протокол), объединяет и записывает их на месте.

Эта программа кажется простой, но код все еще сложен и сочетает в себе функциональный и процедурный код (из моего фона Java). Хотелось бы упростить его и перейти к полнофункциональному. Я читаю о ZIO, и вся картина начинает складываться в моей голове.

Однако после того, как я прочитал начало работы и обзор, у меня остались вопросы.

Основной поток может быть таким:

for {
  config    <- Configuration.parse(args)
  resources <- Downloaders.download(config)
  _         <- Writer.write(resources)
} yield ()
  1. Я предполагаю, что конфигурация, содержащая статические значения, но также один http-клиент, будет помещена в ZIO Environment.

  2. Загрузчики могут быть созданы из будущего и могут использовать ZIO bracket для закрытия соединения. Я полагаю, что могу суммировать результаты с fold. Но я не знаю, как создать и запустить множество загрузчиков.
    Отредактировано a) Поскольку Future чистые, как я могу смоделировать эффект, который будет выполняться асинхронно (я планирую использовать Play Standalone WS Client)?
    Отредактировано б) Я должен создать по одному загрузчику для каждой цели, запрос будет назначен им. Но как мне реализовать это в моем коде? Должен ли я создать ZIO[Configuration, Throwable, List[Downloader]], а затем выполнить их все через collectAllPar?

  3. Понятия не имею, как записать агрегацию на диск.

Я хотел бы использовать этот проект для внутреннего продвижения ZIO. Поэтому я хотел бы использовать лучшие варианты и самый чистый подход. Может кто-нибудь дать мне несколько советов о том, как реализовать эти эффекты и структурировать мой код? Отредактировано: Должен ли я построить свою систему на компонентах ZIO или создать набор функций и обернуть их в эффекты ZIO?

Большое спасибо


person gervais.b    schedule 02.12.2019    source источник
comment
Я не думаю, что вы понимали, как работают ZIO (или приостановленные побочные эффекты в целом). ZIO не волнует, хотите вы запускать его параллельно или нет. Это зависит от того, что вы с ним делаете (как вы его выполняете), что определяет, выполняется он параллельно или нет, потому что он чистый.   -  person Markus Appel    schedule 02.12.2019
comment
Тогда да, я не понимаю. Потому что в ZIO есть явная поддержка параллелизма. Как я могу разделить один эффект на несколько и объединить их обратно в один, если я не указываю это в коде. Насколько я понимаю, он всегда может выполнить мой поток в одном потоке, но он не будет распараллеливать его, если я этого не скажу.   -  person gervais.b    schedule 02.12.2019


Ответы (1)


Ваш вопрос не очень конкретный, а значит, на него, к сожалению, не будет качественных ответов.

Я все же постараюсь ответить на некоторые моменты.

  • Futures не чистые. По возможности избегайте их.
  • Ваш donwloader будет функцией Request => ZIO[R, E, Response]. Чтобы заставить их работать параллельно, используйте ZIO.collectAllPar или ZIO.zip. Результатом будет ZIO[R, E, List[A]] или ZIP[R, E, TupleX[...]], которые вы можете сохранить в resources в вашем понимании.
  • Запись данных в файл может выполняться с помощью new PrintWriter(new File("hello.txt")) Scala, завернутого, как вы уже догадались, в ZIO.bracket.

Чтобы получить больше информации о разработке программ с помощью ZIO, я бы посоветовал прочитать Красивые, простые, проверяемые функциональные эффекты для Scala От самого Де Гуса.

Также, конечно, обратитесь к документации, найденной на веб-сайте ZIO.

person Markus Appel    schedule 02.12.2019
comment
Спасибо за ответ. Многие вопросы расплывчаты, потому что до сих пор неясно, с чего начать. У меня есть еще один вопрос из вашего ответа. Я собираюсь отредактировать свой вопрос, чтобы добавить их. - person gervais.b; 02.12.2019