Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin · Oppitunti

Putken suorittaminen

Materialisoikaa ja suorittakaa graafi.

Oppitunti 4/413 vaihetta

Putken suorittaminen on ilmainen Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssilla on yhteensä 4 oppituntia.

Suunnitelmasta suoritukseksi

Tähän asti putki on ollut pelkkä suunnitelma. Materialisointi on prosessi, joka muuntaa suunnitelman käynnissä oleviksi actoreiksi, jotka todella siirtävät dataa.

Mitään ei tapahdu, ennen kuin kaavio käynnistetään nimenomaisesti. Tämä tekee Akka Streamsista koostettavan ja uudelleenkäytettävän.

ActorSystem

Materialisointi edellyttää ActorSystem-järjestelmää, joka tarjoaa suoratoiston vaiheiden tarvitsemat säikeet ja dispatcher-komponentin. Nykyaikaisessa Akka-versiossa järjestelmä toimii myös implisiittisenä materialisoijana.

Yksi ActorSystem palvelee yleensä koko sovellusta ja monia samanaikaisia suoratoistoja.

import akka.actor.ActorSystem

implicit val system: ActorSystem =
  ActorSystem("data-pipeline")
import system.dispatcher // ExecutionContext

runWith

Suorin tapa suorittaa Source on runWith. Se liittää Sinkin ja materialisoi kokonaisuuden yhdellä kertaa palauttaen kyseisen Sinkin materialisoidun arvon.

Tässä tuloksena on Future[Int], joka valmistuu summan sisältävänä, kun suoratoisto päättyy.

import akka.stream.scaladsl.{Source, Sink}
import scala.concurrent.Future

val total: Future[Int] =
  Source(1 to 100).runWith(Sink.fold(0)(_ + _))

RunnableGraph-kaavion suorittaminen

Jos olet jo rakentanut suljetun RunnableGraph-kaavion to- tai toMat-toiminnolla, materialisoi se kutsumalla run()-toimintoa. Palautusarvo on kaavion säilyttämä materialisoitu arvo.

Näin putken rakentaminen ja suorittaminen voidaan erottaa selkeästi toisistaan.

import akka.stream.scaladsl.Keep
import scala.concurrent.Future

val graph =
  Source(1 to 100)
    .toMat(Sink.fold(0)(_ + _))(Keep.right)

val result: Future[Int] = graph.run()

Suorituksen apuoperaattorit

Sourcet tarjoavat oikoteitä: runForeach, runFold ja runReduce liittävät kukin vastaavan Sinkin ja suorittavat sen heti.

Ne ovat tiiviitä tapoja Sourcen yleisiin päätösoperaatioihin.

import scala.concurrent.Future

val printed: Future[akka.Done] =
  Source(1 to 10).runForeach(println)

val sum: Future[Int] =
  Source(1 to 10).runFold(0)(_ + _)

Tuloksen Futuren käsittely

Päätössinkit palauttavat Future-arvon, joka valmistuu suoratoiston päättyessä tai epäonnistuessa. Rekisteröi takaisinkutsut onComplete-toiminnolla, jotta voit reagoida onnistumiseen tai virheeseen.

Käytä näiden takaisinkutsujen implisiittisenä ExecutionContextina ActorSystemin dispatcheria.

import scala.util.{Success, Failure}

total.onComplete {
  case Success(value) => println(s"Sum = $value")
  case Failure(ex)    => println(s"Failed: ${ex.getMessage}")
}

Realistinen putki

Tyypillinen dataputki lukee tietoja Sourcesta, muuntaa niitä Flow-vaiheilla, suorittaa asynkronista I/O:ta mapAsync-operaatiolla, ryhmittelee niitä eriksi grouped-operaatiolla ja kirjoittaa tiedot Sink-kohteeseen.

Jokainen vaihe on pieni, ja koko putki materialisoituu yhdellä run-kutsulla.

val done =
  lineSource
    .map(parse)
    .mapAsync(4)(validate)
    .grouped(500)
    .runWith(bulkWriteSink)

Epäonnistuneiden streamien uudelleenkäynnistys

Vikasietoisuuden parantamiseksi Source tai Flow kannattaa kääriä RestartSource.withBackoff-kutsulla, jolloin tilapäiset virheet, kuten katkennut yhteys, käynnistävät streamin automaattisesti uudelleen eksponentiaalisesti kasvavalla viiveellä.

Näin pitkäkestoiset tiedonsiirtoputket pysyvät käynnissä ilman manuaalista valvontaa.

import akka.stream.scaladsl.RestartSource
import akka.stream.RestartSettings
import scala.concurrent.duration._

val resilient = RestartSource.withBackoff(
  RestartSettings(1.second, 30.seconds, 0.2))(() => flakySource)

Hallittu sammutus KillSwitchillä

KillSwitch mahdollistaa käynnissä olevan streamin hallitun pysäyttämisen ulkopuolisesta koodista. Lisää KillSwitches.single streamiin viaMat-kutsulla ja säilytä sen materialisoitu arvo, jotta voit kutsua myöhemmin shutdown()-metodia.

Tämä on välttämätöntä pitkäkestoisille streameille, jotka on pysäytettävä sovelluksen sammuessa.

import akka.stream.{KillSwitches, KillSwitch}
import akka.stream.scaladsl.Keep

val (switch, done) =
  source
    .viaMat(KillSwitches.single)(Keep.right)
    .toMat(Sink.ignore)(Keep.both)
    .run()
// later: switch.shutdown()

Resurssien vapauttaminen

Kun sovellus sulkeutuu, lopeta ActorSystem sen säikeiden vapauttamiseksi. Ketjuta lopetuskutsu streamin valmistumisesta palautuvan Futuren perään, jotta sammutus tapahtuu hallitusti.

Jos ActorSystem jää vapauttamatta, JVM pysyy käynnissä ja resurssit jäävät käyttöön.

done.onComplete { _ =>
  system.terminate()
}

Materializerin uudelleenkäyttö

Saman blueprintin materialisoiminen useita kertoja luo itsenäisiä käynnissä olevia streameja, jotka jakavat ActorSystemin resurssit. Blueprint itsessään pysyy muuttumattomana ja sivuvaikutuksettomana.

Näin putki voidaan määrittää kerran ja suorittaa tarvittaessa jokaiselle saapuvalle työlle.

val blueprint =
  Source(1 to 5).toMat(Sink.seq)(Keep.right)

val run1 = blueprint.run()
val run2 = blueprint.run() // independent execution

Pikatarkistus

Pohtikaa, mitä tarvitaan, jotta streami todella käsittelee elementtejä.

Kertaus

Putken suorittaminen tarkoittaa blueprintin materialisoimista ActorSystem-olion avulla käyttäen run-, runWith- tai kätevyyttä lisääviä operaattoreita; jokainen niistä palauttaa Future-tuloksen.

Tutustuitte realistisiin monivaiheisiin putkiin, automaattisiin uudelleenkäynnistyksiin kasvavalla viiveellä, hallittuun sammutukseen KillSwitch-toiminnolla, resurssien vapauttamiseen kutsulla system.terminate() sekä muuttumattoman blueprintin turvalliseen uudelleenkäyttöön itsenäisissä suorituksissa.

Aloita maksutta

Opi Scala tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
143

Usein kysytyt kysymykset

Onko oppitunti ”Putken suorittaminen” ilmainen?

Kyllä – oppitunnin ”Putken suorittaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssin, päivitä CoddyKit PROhon. Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Putken suorittaminen”?

Materialisoikaa ja suorittakaa graafi. Harjoittelet Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Putken suorittaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunnilla?

Kyllä. Jokainen Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Source, Flow ja Sink
  2. Tietovirtojen muuntaminen
  3. Backpressure
  4. Putken suorittaminen
← Takaisin: Scala backend-kehitykseen ja funktionaaliseen ohjelmointiin