Akka Stream의 Working Graph는 데이터 처리 플로우를 레고 블럭처럼 모듈화하고 구성할 수 있는 강력한 도구입니다. 이를 활용하면 복잡한 비동기 데이터 흐름을 간결하고 직관적으로 구성할 수 있습니다. 이에 대한 장단점과 Akka Stream이 제공하는 주요 장치를 설명드리겠습니다.


장점

  1. 모듈성 및 재사용성

  2. 비동기 및 병렬 처리

  3. 명확한 데이터 흐름

  4. 백프레셔 지원

  5. 확장성


단점

  1. 초기 학습 곡선

  2. 디버깅 어려움

  3. 추가 리소스 소비


Akka Stream이 제공하는 주요 장치

  1. Graph DSL

  2. Source / Sink / Flow

  3. FlexiFlow (Custom Graph Stage)

  4. Materializer

  5. Backpressure

  6. Predefined Stages

  7. Supervision Strategy


Akka Stream의 Working Graph는 설계 단계에서 약간의 추가 학습이 필요하지만, 복잡한 스트림 처리 시 강력한 모듈성과 유연성을 제공합니다. 특히 백프레셔와 병렬 처리 지원은 대규모 실시간 데이터 처리 시스템에서 큰 장점으로 작용합니다. 😊


Akka Stream의 Working Graph를 이용하는 과정을 살펴보겠습니다.

Graph 설계

데이터 흐름을 Graph를 통해 화이트보드에 먼저그리고 설계된 코드를 일치시키는것이 AkkaStream Graph의 장점입니다. 

다음과 같이 생상자의 속도와 안정적인 소비를 위해 다음과 같이 Stream을 Graph를 설계했다고 가정해봅시다.


위와같은 데이트 스트림을 화이트보드로 먼저하고  코드로 일치하는 샘플입니다. 

코드구현 

	private val materializer = Materializer.createMaterializer(context.system)

    private fun onProcessNumber(command: ProcessNumber): Behavior<GraphCommand> {
        context.log.info("Received ProcessNumber command with number: ${command.number} - ${context.self.path().name()}")
        Source.single(command.number)
            .via(operation)
            .buffer(1000, OverflowStrategy.dropHead())
            .throttle(10, Duration.ofSeconds(1))
            .runWith(Sink.foreach { result -> command.replyTo.tell(ProcessedNumber(result)) }, materializer)
        return this
    }


TestCode

    @Test
    fun testProcessNumberAdd() {
        val probe: TestProbe<GraphCommand> = testKit.createTestProbe()
        val graphActor: ActorRef<GraphCommand> = testKit.spawn(GraphActor.create())

        graphActor.tell(ProcessNumber(5, probe.ref))
        val response = probe.receiveMessage() as ProcessedNumber
        assertEquals(6, response.result)
    }



기본 액터모델에 Stream기를 탑재한 전체 샘플코드로 , 액터모델에 강력한 스트림기능을 탑재할수 있습니다.

스트리밍 프로그래밍의 기본철학은 사용자로부터 발생하는 데이터를 모아두었다가 한꺼번에 처리하는 배치방식이 아닌 유체의 흐름처럼 다루어야한다로

실제 존재하는 유체장치(물또는 수도의 흐름을 안정적으로 공급)로 부터 얻은 아이디어가가 장치로 적용되어있습니다.  

전체 샘플코드 :