아래 내용을 일부 번역했다.
Akka Streams 의 핵심 개념
- Akka Streams 는 bounded buffer space 를 사용해서 sequence of elements 를 처리하고, 전송하기 위한 library 이다. 이 bounded buffer space 를 사용하는 속성은 우리가 boundedness 라고 부르는 것이다.
- 그리고 이것은 Akka Streams 의 특징을 정의하고 있다.
- entity 들을 처리하는 것의 chain 을 표현하는 것이 가능하다.(graphs)
- 이 각각의 entity 들은 각각 독립적으로 수행된다. 그리고 동시에 수행 가능하다.
- 반면에 특정시간에 단순히 제한된 elements의 수를 buffering 한다.
- bounded buffer 들의 이 속성은 actor model 과의 다른점 중 하나이다.
- 일반적으로 각각의 actor 는 unbounded mailbox 나 bouned 지만 dropping mailbox 를 가지고 있다.
- Akka Streams processing entity들은 drop 을 하지 않는 bounded mailbox 들을 가지고 있다.
Stream
- data를 움직이고, 전송하는 active process
Element
- stream 의 processing unit
- 모든 operation들은 elements의 모습을 변경하거나 upstream 에서 downstream 으로 전송한다.
- Buffer 사이즈들은 언제나 elements의 수로서 표현된다. elements의 실제 사이즈와 상관없이
Back-pressure
- flow-control 의 방법
- flow-control :consumer 가 그들의 현재 availability 를 producer 에게 알리는 방법
- 효과적으로 the upstream producer 를 slowing down 한다. 그래서 consumption speed 들을 맞춘다.
- Akka Streams 의 context 에서 back-pressure는 언제나 non-blocking 과 비동기로 이해되어진다.
Graph
- 그래프는 pathway 들을 정의해서 stream processing topology 를 설명한다.
- stream 이 실행되고 있을 때, 이 그래프를 통해서 elemnt 들은 flow 해야 한다.
Operator
- Graph 를 구성하는 모든 building block 들의 공통이름
- operator 의 예는
map()
,filter()
가 있다. -
GraphStage
를 확장한 custom ones - 그리고
Merge
나Broadcast
같은 graph 연결지점들 - built-in operator 들: https://doc.akka.io/docs/akka/current/stream/operators/index.html
streams 을 정의하고, 실행하는 것
linear processing pipeline 은 Akka Streams 에서 다음과 같은 core concept 을 사용해서 표현되어질 수 있다.
Source
- 하나의 output 을 갖는 operator 이다.
- downstream operator 들이 data elements을 receive 할 준비가 되면 항상 data elements 를 방출한다.
Sink
- 하나의 input 을 갖는 operator 이다.
- data elements를 request 하고, accept 하는
- element 들의 upstream producer 를 slowing down 하는 것이 가능하다.
Flow
- 하나의 input 과 output 을 갖는 operator이다.
- Flow 는 그것으로 흘러 가는 data elements 를 transforming 하는 것에 의해 upstream 과 downstream 을 연결한다.
RunnableGraph
양쪽 끝이 각각 Source 와 Sink 에 attached 된 Flow 은 run()
할 수 있는 상태이다.
Flow 를 Source 에 붙여서 composite source 를 만드는 것이 가능하고, Sink 에 Flow 를 prepend 해서 새로운 sink 를 만드는 것도 가능하다.
stream 이 적절하게 양쪽에 source 와 sink 를 갖고 만들어지면, 이것은 RunnableGraph type 에 의해 표현된다. 그리고 이것은 실행될 수 있는 상태라는 것을 가리키는 것이다.
RunnableGraph 를 만들고 나서 모든 source, sink, 다른 operator 들을 연결하는 것에 의해서 RunnableGraph를 만들고 난 이후에도 이것이 materialized 되기 전까지는 data 가 들어오지 않는다. Materialization 은 Graph 에 의해 설명된 계산을 실행하기 위해 필요한 모든 리소스들을 할당하는 절차이다.
사용 예시
아래처럼 source -- flow ---> sink
를 연결한다.
// Explicitly creating and wiring up a Source, Sink and Flow
Source(1 to 6).via(Flow[Int].map(_ * 2)).to(Sink.foreach(println(_)))
아래처럼 Flow 가 생략될 수도 있다.
// Starting from a Source
val source = Source(1 to 6).map(_ * 2)
source.to(Sink.foreach(println(_)))
댓글 없음:
댓글 쓰기