Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

AKKA는 루나소프트에서 대용량 메시징 처리를 부분적으로 활용하는 툴킷으로( 이상한 툴킷 - 똑바로 읽어도 거꾸로 읽어도 AKKA입니다.)  

루나소프트에서는 이 기술을 어떻게 활용하는지 활용편을 소개합니다.


Image Added


AKKA를  대용량 처리를 위해 선택한 이유?

...

Akka는 오픈 소스 툴킷으로, JVM 상의 동시성과 분산 애플리케이션을 단순화하는 런타임이다. Akka는 동시성을 위한 여러 프로그래밍 모델을 지원하지만, Erlang으로부터 영향을 받아 actor 기반의 동시성이 두드러진다.

자바 스칼라 언어 모두로 작성이 가능하다. Akka는 스칼라 2.10로 작성되었으며, 스칼라 2.10의 Akka의 actor 구현은 스칼라 표준 라이브러리에 포함되어있다.[1]


반응성이 반응성 좋은 서비스를 위해, 위해  분산처리도 중요하지만 단일장비 자체의 성능을 올리는것도 중요합니다. 물론 AKKA는 클러스터를 통해 분산처리 환경 개발자체를 단순화하는 방법도 제공합니다. 

동시성 처리를 높이기위해 단일 어플리케이션 내에서도 한가지 일만 하는것이 아닌 동시에 여러가지 일을 수행하게 할수 있으며 , 스레드를 적극 활용하여 병렬성을 이용하는 개발을  멀티스레드 프로그래밍 이라고 합니다.


동시성 처리및 병렬처리


Image Added


Image AddedImage Removed


동시성과 병렬성은 약간의 차이가 있지만, 다음과 같이 간략하게 설명될수 있습니다.

...

많은 사람이 비동기식으로 개발하면 멀티 스레드를 활용하는것처럼 이해하고 있지만~ 비동기와 멀티스레드는 다른의미 입니다. 비동기 프로그래밍은 단일스레드에서 작업효율을 낼수 있으며  싱글/멀티 스레드로 작동할지는 결정할수 있지만 플랫폼에 따라 싱글스레드로 제약이 될수 있을수 있습니다.

  • 동기식 : 계란을 요리 한 다음 토스트를 요리합니다.
  • 비동기식 단일 스레드 : 계란 요리를 시작하고 타이머를 설정합니다. 토스트 요리를 시작하고 타이머를 설정합니다. 둘 다 요리하는 동안 부엌을 청소하십시오. 타이머가 꺼지면 계란을 불에서 꺼내고 토스트를 토스터에서 꺼냅니다.
  • 비동기식, 멀티 스레드 : 계란 요리와 토스트 요리를 위해 두 명의 요리사를 더 고용합니다. 이제 자원을 공유 할 때 요리사가 부엌에서 서로 충돌하지 않도록 요리사를 조정하는 데 문제가 있습니다. 특정 조리기구가 하나만 존재할때 이문제는 발생할수 있습니다.

우리가 보유하고 있는 장비 성능대비 50%이상을 활용하기 어려울수 있으며 다양한 이유로 우리의 단일장비는 안정적으로 작동하기 위해 천천히 작동될수 있습니다.

  • 100km의 속도를 낼수 있지만, 항상 30km만을 달리는 자동차~
  • 30km의 속도만을 내는데~ RPM이 100%인 자동차~
  • 짐을 조금더 적재 했다고~ 10km미만의 속도를 내는 자동차~
  • 100km를 달리면 뻗는 자동차~



암달의 법칙

병렬 컴퓨팅에서 멀티 프로세서를 사용할 때 프로그램의 성능향상은 프로그램의 순차적인 부분에 의해 제한된다. 예를 들면, 프로그램의 95%가 병렬화 할 수 있다면 이론적인 최대 성능 향상은 아무리 많은 프로세서를 사용하더라도 최대 20배로 제한된다. 


병렬 컴퓨팅을 위해서  위해,  자원을 공유하는 멀티스레드 프로그래밍을 하게되는 경우, 대표적으로 다음과같은 4가지 문제를 피하기 어려울수 있습니다.

...

그러면 Akka에서는 어떻게 병렬성과 동시성문제를 포함 메시지 순차보정을 멀티스레드 프로그래밍 없이 할수 있을까요? 액터모델과 Mailbox Dispatcher 의 조합으로 이해할수 있습니다.

  • 액터 특징 : 단일 액터는 , 순차성이 보장되며 자신만의 메시지 Queue를 가질수 있습니다. 병렬로 작동시키기위해서는 동시처리를위해 멀티스레드가 아닌 액터를 늘릴수 있으며 스레드보다 훨씬 가볍습니다. ( 1스레드는 1MB의 스택메모리를 예약합니다. )
  • MailBoxQueue : 모든 발생이벤트는 수행 되기전 Queue에 적재됩니다. 작업완료는 별도의 메시지를 통해 통지 받을수 있습니다. CQRS를 작성하기에 용이합니다순차성이 보장되지만, 메시지 우선순위를 조정할수도 있습니다.
  • Dispatcher : 액터에 요청된 이벤트의 수행을 어떠한 스레드전략으로 수행할지 규칙은 Dispatcher에 할수 전략으로 수행할지는 Dispatcher에 규칙을 정할수 있으며, 멀티스레드를 이용하지만 이용할수 있지만~ 멀티스레드 프로그래밍을 할 필요가 없습니다.
  • 액터 : 모든 액터는 메시지로 명령수행이 가능하며 리모트로 확장될시 클러스터 라우터를 통해서도 작업분배가 용이합니다. 이것은 로컬과 리모트의 프로그래밍 방식에 큰차이가 없음을 의미하며 Kafka와 같은 메시징 툴과의 조합도 유리할수 있습니다. ( alpakka 는 Reactive Stream의 구현체로 Akka를 모든곳과 연결을 할수 있는 모듈명입니다. )

...

해결사례와 적용사례

...

루나소프트에서 AKKA의 부분요소를 활용하여 문제를 다양한 솔루션에서 어떻게 해결하였는지 이용되었는지 살펴보겠습니다.


스마트 플러스 상품연동

  • 호스팅 연동 상품정보 병렬및 동시성처리를 위해 멀티스레드를 대신하여, Akka의 Dispatcher가 Kafka와 함께 활용되고 있으며 상품정보를 안정적으로 업데이트하고 있습니다.

...

-셀룩 : https://cellook.kr/

...


FSM(유한 상태머신) ACTOR

...

배치처리기의 업데이트 주기를 큰 성능 저하없이 단축을 할수 있으며 , Flush 시간에따라 실시간에 가깝습니다.실시간에 가까우며 전통적인 배치처럼 너무 많은 데이터를 한꺼번에 처리하지 않습니다.

소스 공개 : https://github.com/psmon/EventListenerAPI




고객의 문장을 이해하기위해 NLP사전관리를 하고 있으며 단어 매칭이 될시 자주쓰는 메시지 설정을 통해 빠른 상담이 가능합니다. 

단순하게 매크로 기능뿐만 아니라, 고객이 사용한 상담단어는 곧 트렌드가 될수 있습니다. 고객의 문장을 FSM ACTOR를 활용하여 고성능으로 적재를 합니다.


상담트렌드 실시간 형태소분석

형태소분석기를 액터에 탑재하여  AKKA 이벤트 처리기를 활용하여  실시간으로 고객의 트렌드를 파악할수 있으며

...


기다림이 없는 메시지 전송 -

...

Tell ( Forgot And Fire )

...

카카오모빌리티 챗봇/채팅상담 - 루나개발제공


챗봇에서 발생하는 챗봇응답속도를 위해 메시지를 비동기적(액터 Tell)으로 저장하고

...

  • 코드 변경불가 상위스트림에서, 상담 콜 이벤트의 순차 보장 
  • 상담 업무할당 균등분배 ( 준비중 )


링크:


마무리

...

분산환경에서의 동시성 처리에대한 해결모델은 언어및 플랫폼에 종속적이지 않으며,AKKA가 아니여도 됩니다.

...

루나소프트에서는 이 툴킷을 MSA에 전면적으로 채택하기 채택하여 클러스터로 활용하기 보다, AkkaStream을 포함 부분적으로 활용하고 있습니다.