Putken suorittaminen
Materialisoikaa ja suorittakaa graafi.
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 // ExecutionContextrunWith
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 executionPikatarkistus
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.
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
- Source, Flow ja Sink
- Tietovirtojen muuntaminen
- Backpressure
- Putken suorittaminen