Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Akka - Die Backend Werkzeugkiste

Akka - Die Backend Werkzeugkiste

Skalierbare, verteilte, parallele und performante Anwendungen sind Hexenwerk? Nicht so mit dem Akka Toolkit!
Verfügbar für Scala, Java und .Net abstrahiert Akka über Rechner hinweg und stellt ein sehr mächtiges Werkzeug für die Entwicklung verteilter, selbstheilender Systeme zur Verfügung und ist somit ins Besondere für moderne Microservice Architekturen und skalierbare Serveranwendungen von Interesse.
Wir beleuchten Akka unter Scala und stellen euch die grundlegenden Mechanismen vor.

Arvid Lange

July 28, 2016
Tweet

Other Decks in Programming

Transcript

  1. Aktoren • Ein Weg Aufgaben zu verteilen • Hierarchiebildung möglich

    – Eltern kennen ihre Kinder – Kinder kennen ihren Elternknoten – Überwachungsstrategien möglich • Können vereinfacht wie Threads anderer Sprachen behandelt werden Trivia: val theOneWhoWalksTheBubbleOfSpaceTime: InternalActorRef = new MinimalActorRef{...}
  2. Kommunikation zwischen Aktoren PubSub import DistributedPubSubMediator.{Publish, Subscribe} val mediator =

    DistributedPubSub(context.system).mediator mediator ! Subscribe(“channel”, self) Mediator ! Publish(“channel”, “I will be send via PubSub!”)
  3. Mehr über Aktoren • Aktoren sind gegenüber Zugriffen geschlossen •

    Ansprechen eines Aktors nur über die z.T. bereits vorgestellten Kommunikationswege möglich • Kann sich nur selbst beenden – Einen Aktor bitten sich selbst zu töten ist natürlich möglich mit einer „PoisonPill“ someActor ! PoisonPill self ! PoisonPill
  4. Mehr über Aktoren • Kommunikation zwischen Sender, Eltern und Kindern

    ist gegeben • Kommunikation zwischen „fremden“ Aktoren möglich: – Absoluter Pfad: akka://System/user/ultraCoolActor – Relativer Pfad: /user/HelloActor – Oder: ../../MyFathersUncle val someSystemActor = context.actorSelection(“/user/systemActor”)
  5. Kommunikation zwischen Systemen • Über Adressen können Router anderer Cluster

    angesprochen werden • Der Router selbst ist wieder ein Aktor und kann Nachrichten an Aktoren weiterleiten • Setzt definierte Cluster voraus • Cluster können rechnerübergreifend definiert sein
  6. Kommunikation zwischen Systemen • Ein Cluster braucht einen „Seed“, also

    einen Aktor, der als erstes mit dem Cluster gestartet wird • Ein Aktor kann auf „MemberUp“ und „MemberDown“ Events hören • Absolute Adressen müssen zwischen Clustern bekannt sein
  7. REST & Websockets REST Schnittstelle durch Akka Http oder Spray

    startServer(interface = “127.0.0.1”, port = 8080) { path(“someurlpath”) { get { complete { “<h1>Hello TechTalk listeners</h1>” } } }~ path(“websocket”) { handleWebSocketMessages(flow) } }
  8. Streams + Sehr effizient für Datenbearbeitung und Bewegung + Hoch

    skalierbar ohne Begrenzung der Datenmenge + Hohe Abstraktion über Aktoren + Modular, wiederverwendbar, kombinierbar - Nicht gut dokumentiert - Anderes Paradigma als Aktoren
  9. Graphen Streams können als Graph organisiert werden und bestehen aus:

    – Quellen – Senken – Flüssen – Graphen
  10. Graphen • Leitet Daten von einer Quelle zu einer Senke

    • Dazwischen können Operationen auf Daten ausgeführt werden val flow1 = Flow.fromSinkAndSource(Sink.ignore, Source.actorPublisher[Publisher](Props[Publisher]) val flow2 = Sink.actorRef(system.actorRef(Props[Receiver]), Unit).runWith( RunnableGraph.fromGraph(GraphDSL.create() {… val in = Source(...) val operation = Flow[String].map(_ + “hello”) val out = Sink(...) in → operation → operation → out ... }))
  11. Graphen • Einfacher Filter auf einem Stream: type MessageFilter =

    MessageIn => Boolean def toMessage(msg: MessageIn): Message = TextMessage.Strict(msg.text) def flow(messageFilter: MessageFilter, source: Source): Flow[Any, Message, NotUsed] = Flow.fromSinkToSource(Sink.ignore, source.filter(messageFilter).map(toMessage))
  12. Nächster Talk ... Spring Data – Nur noch eine API

    für SQL, NoSQL und ElasticSearch? <Patrick Wolf/> August 2016 > talks.cosee.biz > blog.cosee.biz