The document describes the key abstractions in Akka Streams - Source, Sink, and Flow. It provides examples of creating Sources from single values, iterators, and ticks. It also gives examples of Sinks like foreach, head, fold, and reduce. Various Flow combinators are demonstrated like map, filter, take, drop, and flatMapConcat. The document then gives an example problem of reading log files from HDFS in parallel to find 100 fraudulent transactions using Akka Streams.
107. • Читать данные из очереди и обрабатывать.
36
Задача
Source Process Sink
Future
108. 37
Красивый код на стримах
val source = ZMQSource(context,
mode = ZMQ.PULL,
timeout = 1 second,
addresses = List("tcp: //127.0.0.1:12345")
)
def process(in: ByteString): Future[Int] = ???
109. 37
Красивый код на стримах
val source = ZMQSource(context,
mode = ZMQ.PULL,
timeout = 1 second,
addresses = List("tcp: //127.0.0.1:12345")
)
def process(in: ByteString): Future[Int] = ???
110. 37
Красивый код на стримах
val source = ZMQSource(context,
mode = ZMQ.PULL,
timeout = 1 second,
addresses = List("tcp: //127.0.0.1:12345")
)
def process(in: ByteString): Future[Int] = ???
111. 37
Красивый код на стримах
val source = ZMQSource(context,
mode = ZMQ.PULL,
timeout = 1 second,
addresses = List("tcp: //127.0.0.1:12345")
)
def process(in: ByteString): Future[Int] = ???
112. 38
Красивый код на стримах
val stream = source
.mapAsync(10)(process)
.toMat(Sink.last)(Keep.right)
val result: Future[Int] = stream.run()
result.onComplete(_ => "We are done here")
113. 38
Красивый код на стримах
val stream = source
.mapAsync(10)(process)
.toMat(Sink.last)(Keep.right)
val result: Future[Int] = stream.run()
result.onComplete(_ => "We are done here")
114. 38
Красивый код на стримах
val stream = source
.mapAsync(10)(process)
.toMat(Sink.last)(Keep.right)
val result: Future[Int] = stream.run()
result.onComplete(_ => "We are done here")
115. 38
Красивый код на стримах
val stream = source
.mapAsync(10)(process)
.toMat(Sink.last)(Keep.right)
val result: Future[Int] = stream.run()
result.onComplete(_ => "We are done here")
116. 38
Красивый код на стримах
val stream = source
.mapAsync(10)(process)
.toMat(Sink.last)(Keep.right)
val result: Future[Int] = stream.run()
result.onComplete(_ => "We are done here")
124. 43
Проблема остановки
trait Control {
/**
* Disconnect the underlying ZMQ socket, deliver the
remaining data and finally close the socket.
*/
def gracefulStop(): Unit
}
125. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
126. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
127. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
128. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
129. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
130. 44
Проблема остановки
val source: Source[ByteString, Control] = ???
val stream: RunnableGraph[(Control, Future[Int])] =
source
.mapAsync(10)(process)
.toMat(Sink.head)(Keep.both)
val (control: Control, result: Future[Int]) = stream.run()
result.onComplete(_ => "We are done here")
control.gracefulStop()
137. • Emit элемента
• Завершение
• Ошибка
• Backpressure
• Отмена
47
Что нужно знать про stages
138. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
139. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
140. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
141. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
142. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
143. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
144. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
145. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
146. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
147. 48
Свой Source
val s: Source[Int, ActorRef] =
Source.actorPublisher[Int](Props(new MySourceActor))
class MySourceActor extends ActorPublisher[Int] {
override def receive: Receive = {
case ActorPublisherMessage.Request(n) =>
onNext(100)
onCompleteThenStop()
onErrorThenStop(new Exception)
case ActorPublisherMessage.Cancel =>
context.stop(self)
}
}
148. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
149. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
150. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
151. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
152. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
153. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
154. 49
Reactive Zmq
case object GracefulStop
case object DeliverMore
class MySourceActor(addr: String)
extends ActorPublisher[Array[Byte]] {
var conn: ZMQ.Socket = ???
override def preStart(): Unit = {
conn.connect(addr)
}
override def postStop(): Unit = {
conn.disconnect(addr)
}
155. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
156. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
157. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
158. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
159. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
160. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
161. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
162. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
163. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
164. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
165. 50
Reactive Zmq
override def receive: Receive = {
case ActorPublisherMessage.Request(_) | DeliverMore =>
Option(conn.recv()) match {
case Some(msg) =>
onNext(msg)
if(totalDemand > 0) self ! DeliverMore
case None => self ! DeliverMore
}
case ActorPublisherMessage.Cancel | GracefulStop =>
conn.disconnect(addr)
onCompleteThenStop()
}
166. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
167. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
168. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
169. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
170. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
171. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
172. 51
Reactive Zmq
val source: Source[Array[Byte], Control] =
Source.actorPublisher[Array[Byte]](
Props(new MySourceActor( ???))
).mapMaterializedValue { ref =>
new Control {
override def gracefulStop() = ref ! GracefulStop
}
}
173. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
174. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
175. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
176. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
177. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
178. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
179. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
180. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}
181. 52
Свой Sink
val s = Sink.actorSubscriber[Int](Props(new MySinkActor))
class MySinkActor extends ActorSubscriber {
override def receive: Receive = {
case ActorSubscriberMessage.OnNext =>
cancel()
request(100)
case ActorSubscriberMessage.OnComplete =>
case ActorSubscriberMessage.OnError =>
}