[컴] Akka Streams

 

아래 내용을 일부 번역했다. 

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

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(_)))

댓글 없음:

댓글 쓰기