유닛테스트


전통적 유닛테스트에서는 함수호출의 결과값을 기다려야하는 동기적 검사 위주로 작성되지만 이벤트 메시징 큐기반으로 작성된 모듈기반에서는 이러한 테스트 방식을 채택한다고 하면 작동중인 코드를 중단한후 검사해야하지만

액터의 특성을 이용 관찰자를 연결하여 관찰자의 메시지 검사를 통해 서비스 액터의 블락킹없이 유닛 테스트를 수행할수 있습니다.

# hello 이벤트를 받으면, world를 반환하는 액터의 유닛검사 방법
greetActor.tell("hello", getRef());
probe.expectMsg(Duration.ofSeconds(100), "world");

여기서 소개되는 내용은 유닛테스트를 기본 채택하였으며, 유닛테스트가 됨으로 더 개선된 버전으로 작성할수 있는 활동으로 이어질수 있습니다.

링크: akka unit test

Throttle


클라우드로 제공되는 API(OpenAPI - GPT)는 호출제약과 함께 비용의 문제가 있을수 있습니다.  AKKA Stream이 제공하는 Throttle이용하여 메시징의 속도를 제어 할수 있습니다.

                final ActorRef throttler1 =
                        Source.actorRef(1000, OverflowStrategy.dropNew())
                                .throttle(processCouuntPerSec, FiniteDuration.create(1, TimeUnit.SECONDS),
                                        processCouuntPerSec, (ThrottleMode) ThrottleMode.shaping())
                                .to(Sink.actorRef(greetActor, akka.NotUsed.getInstance()))
                                .run(materializer);

링크 : SampleCode


Router


분산환경에서 상태없는 서비스에서는 라운드로빈과같은 LB를 이용하는 전략이 일반적입니다.

하지만 AI처리기는 다양한 상태를 가질수 있으며 AI상담배분과같이 복잡한 분배 규칙을 가질수도 있습니다.

이때 라우팅툴은 도메인의 복잡성을 단순화해주어야하며 AKKA에서는 다양한 전략적 분배기를 제공해줍니다.


AKKA의 라우팅 툴은 액터와 연동되어 아래 3가지 전략을 제공되는 툴로 수행할수 있습니다.

  • 라우팅 : 작업 분배의 규칙을 가지고 있으며 우리가 규칙을 설계할수 있어야합니다.
  • 라우터 : 작업 분배가 발생되는 지점으로 작동배포 전략및 롤을 설계할수 있어야합니다.
  • 라우티 : 작업 분배가 도착한 지점으로 멀티스레드 프로그래밍 필요없이 단일지점에서 동시성/병렬성을 포함 작업완료 모니터링을 보낼수 있어야합니다. 


SmallestBox

메시지우선순위를 고려해 역전할수 있는 기능도 제공하며 SmallestBox는 처리량이 늦은 라우티에게  분배할수 있는 툴로

AKKA에서 제공되는 라우팅툴중 하나이며 이와 같은 라우팅을 이용할수 있습니다.

링크 :


Near RealTime


AI를 이용하는 시스템은 일반적으로 대량의 데이터가 실시간으로 발생합니다. 하지만 이것을 분석처리하는 지점은 전통적인 방식인 배치전략을 세울수 있지만

오늘날 처리해야할 데이터량은 과거에비해 증가하였으며 배치처리기로는 한계가 있습니다. 단순하게 정보를 더 빠르게 제공해야한다는 과제가 아닌 

단순 배치처리는 대용량으로 발생하는 데이터를 예측과 실행 분산계획을 세울수 없으며 다음과 같은 데이터 처리전략이 필요할수 있습니다.  

  • 특정 시간만큼 쌓인 데이터를 소비처리
  • 특정 개수만큼 쌓인 데이터를 소비처리
  • 소비처리기에 문제가 있을시 생산의 속도를 조절 ( BackPressure )


링크



Kafka


대용량으로 발생하는 이벤트를 유실없이 저장하기위해 Kafka를 이용하는것은 이미 대세가 되었습니다.

하지만 Kafka를 잘 이해하고 활용해야하는 시스템도 Stream처리가 가능해야하며 이것은 Reactive Streams 활동중 일부입니다.


Reactive Stream의 활동의 구현체는 다음과같으며 주요 메이저 개발사가  서로 다른 플랫폼이라 할지라도 상호 연동을 위한 약속을하고

성공한 활동이며 AKKA가 아니여도 됩니다. 이중 하나를 잘 활용하는것만으로 주변기술을 이용할수 있습니다. 

  • Project Reactor ( Spring Boot Webflux)
  • RxJava ( Netflix )
  • Akka Streams ( LightBend)
  • Java9 ( Java 9에 Stream API채택)


Kafka를 잘 활용하기위해 Java9이상의 StreamAPI 및 Webflux를 이용할수도 있습니다. Akka Stream을 이용하여 ReactiveStream을 준수하는 모든 메시징및/데이터 플랫폼과 연결을 시도하는 프로젝트가 Alpakka이며

AI를 이용하는 플랫폼이 빅데이터인 Nosql을 이용할 가능성이 높으며 Nosql의 데이터도 스트림으로 처리할수 있는 툴을 제공해줍니다.


AKKA Streams API는 Java9 Stream API WebFlux의 Stream기능과 유사하지만 차이점은 동일요소를 이용해서 이벤트를 원격으로 전송할수 있다란점이며

필요하면 클러스터화 된 시스템을 직접 설계할수 있는 툴을 제공해줍니다.  - 04. Clustering






  • No labels
Write a comment…