Versions Compared

Key

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

Image RemovedImage Added


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

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

AKKA를 부분적으로 선택하게 된 이유?

Akka - 위키백과

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

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

성능이 높고 반응성이 높으며 가용성 있는 서비스를 운영하기 위해, 분산처리도 중요하지만 단일장비 자체의 성능을 올리는것도 중요합니다.

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

동시성 처리및 병렬처리

Image Removed

동시성과 병렬성은 약간의 차이가 있지만

  • 동시성 : 커피주문 받고 만들기를 동시에한다. ( 커피머신을 이용하면서도 주문을 받음)
  • 병렬성 : 커피주문을 받는사람과 만드는 사람이 각각 따로 있다. 

일반적으로 작업의 최대 효율을 높이기 위해 동시성과 병렬성을 함께 고려해야 하며 병렬성에서는 커피주문 접수받는것 자체가 밀리게 되면, 그동안 커피만드는 사람이 놀수 있는 문제가 있으며

커피 주문을 받고/만들기를 동시에 하는 경우 커피를 만드는 커피머신이 결정적으로 느린경우 동시성 처리를하는 작업자를 늘린다고 작업효율이 증가하지 않습니다.

작업효율을 높이기위해 병렬+비동기처리 프로그래밍의 난이도가 높아지며 결정적으로 암달의 법칙에 의해 작업자를 늘린다고 작업효율이 높아지기 어렵습니다.

우리가 가진 비싼장비 성능대비 50%이상을 활용하기 어렵습니다.   

암달의 법칙

Image Removed

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

AKKA역시 멀티스레드를 활용하기 때문에  암달의 법칙에서 자유로울수는 없지만,  순차적으로 처리하는 부분에 대한 면적을 최대한 줄이면서 멀티스레드 프로그래밍을 할필요 없게 단순화해주며 동일한 개발컨셉으로 네트워크 분산처리를 지원합니다. 원격에 있는 멀티스레드를 제어할수 있다라는 이야기이며 다음과 같은 특징을 가지게 됩니다.

Actor의 메시지큐와 Dispatcher

Image Removed

  • MailBoxQueue : 모든 발생이벤트는 수행 되기전 Queue에 적재됩니다. 작업완료는 별도의 메시지를 통해 통지 받을수 있으며  
  • Dispatcher : 요청된 이벤트의 수행을 어떠한 스레드전략으로 수행할지 규칙은 Dispatcher에 할수 있으며, 멀티스레드를 이용하지만 멀티스레드 프로그래밍을 할 필요가 없습니다.
  • 액터 : 모든 액터는 메시지로 명령수행이 가능하며 리모트로 확장될시 클러스터 라우터를 통해서도 작업분배가 용이합니다. 이것은 로컬과 리모트의 프로그래밍 방식에 큰차이가 없음을 의미하며 Kafka와 같은 메시징 툴과의 조합도 유리할수 있습니다. ( alpakka 는 Reactive Stream의 구현체로 Akka를 모든곳과 연결을 할수 있는 모듈명입니다. )

해결사례와 적용사례

동시성 처리와 분산처리에 특화된 툴킷으로, 이 기술을 루나에서는 어떻게 활용하는지 활용편을 포함 실제 사용한 작동가능한 샘플 코드를 공개합니다.




Image Added

AKKA 채택이유?

...


다양한 언어와 플랫폼을 수용하는 개발방식을 폴리그랏 프로그래밍이라고 정의를 합니다.

우리는 JAVA/PHP/.NET 백엔드 세진영의 경계단위를 적절하게 분리하고 개발문화를 균형적으로 발전하는 방식을 채택하였으며

다양한 개발환경의 균형을 유지하는것은 항상 어렵고 바쁜일중에 하나입니다. 


서비스가 성장함에 따라 보안/성능 문제등 기술부채의 이슈가 발생하게되며 단순하게 비동기/멀티스레드 프로그래밍만으로

대용량 처리의 문제를 해결하는것에 한계를 느끼게 되었으며  언어및 플랫폼 중립적인  새로운  패러다임을 조사하게 되었습니다.

물론 대용량 처리의 문제를 해결하기 위해 처음 선택한 플랫폼은 카프카였습니다.


Image Added

AKKA는 초기부터 CQRS를 포함 다양한 이벤트 중심의 메시징 패턴을 툴킷에 포함시켰으며

DDD는 개발철학및 방법론에 가깝지만 CQRS는 DDD에서 이론을 소개하기 시작하였고 AKKA를 포함 구현체들이 하나둘 등장하고 있습니다.


여기서 툴킷은 라이브러리와 유사한 개념으로 우리가 결정한 프레임워크에 탑재하거나 부분적으로 이용할수 있음을 의미합니다. 

라이브러리를 레고조각처럼 선택하고 조립할수 있어서 라이브러리 보다는 상위개념이며 다양한 공구가 준비된 툴킷으로 표현되는것이 정확합니다.

  • 스트림처리 API가 없는 자바7에 , AKKA스트림을 탑재하여 JAVA8부터 제공하는 스트림기능보다 더 강력하게 사용할수 있습니다.
  • 닷넷코어에서 Akka.net을 탑재하여 유사한 프로그래밍 모델로 대용량 처리를 할수 있습니다.
  • https://dev.to/withinboredom/php-actors-dapr-39h1 - php진영에서도 액터모델을 활용할수 있지만 여기서 소개하는 akka와는 약간 차이는 있습니다. 타진영 플랫폼에서는 어떻게 해결을 할까? 같이 고민하는것으로도 우리는 충분합니다.


이것을 전반적으로 도입하기에는 학습곡선이 높을수 있습니다.  AKKA는 프레임워크가 아닌 툴킷이며 유용한 도구가 무엇이 있는지 살펴보기로 하였습니다.


레일건(못박는 공구)을 알지못한다고 하면 우리는 망치로만 못을 박기때문입니다. ( 레일건을 직접 만드는것은 훨씬 어려울수 있습니다.)

아카에서 레일건은 하나의 공구일뿐이고 다양한 공구를 제공합니다.

Image Added

링크 : https://getakka.net/articles/intro/what-is-akka.html

AKKA의 문서접근방법은 아키텍처와 이론을 먼저 소개하고 툴킷사용법을 소개합니다. ( JAVA/NET 유사 )

Reactive Stream/CQRS(이벤트소싱)/Streams 등 5년전에는 낯선 단어였지만  ReactiveStream 활동으로 이 툴킷은 이미 여러진영에 영향을 주고 있었으며

단순하게 이론만이 아닌 유닛테스트 가능한 구현체가 존재합니다. 

유닛테스트에 관심이 있다고하면 메시지 큐시스템을 사용하는 곳에서 블락을 시키고 검사를 하는 기존 방식의 유닛테스트의 한계를 극복하기위해

블락없이 메시지를 검사하는 테스트 툴킷을 제공합니다. 

정리된 자료 : UnitTest For Actor Message


AKKA는 툴킷의 특성을 가지고 있으며, 필요한 도구만 이용 가능합니다. 그래서 프레임워크가 이미 선택된 상황에서도 부분도입 가능하며

학습곡선이 높은것은 단점으로 지적될수 있지만 역설적으로 복잡한 문제를 풀수 있는 단순화된 방법인 툴을 이용할수 있습니다.

해결사례와 적용사례

...

Image Added

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

스마트 플러스 상품연동

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


Image Added

AKKA는 다양한 외부 고성능 메시징/데이터 툴과도 연결이 용이하며, 내부 어플리케이션에서의 비동기처리뿐만 아니라

외부에서 흘러들어오는 데이터를 블락없이 유연하게 처리하는 Stream장치를 제공합니다.

AKKA를 만든 LightBend가 주도하는 Reactive Stream의 활동으로 Kafka를 포함 다양한 메시지/데이터 처리 오픈플랫폼이 가입되어 있습니다.

참고 아티컬 :



AKKA Dispatcher

Akka Dispatcher를 활용하면, 멀티스레드 프로그래밍을 할 필요없지만 다중스레드를 제어할수 있습니다.

비동기(동시성) 프로그래밍만으로 병렬성문제를 복합적으로 해결할수 없으며 동시성과 병렬성 처리문제를 단순화해줍니다.

순차성/동시성/병렬성은 다음과 같은 특징을 가지게됩니다.


Image Added


Image Added

많은 사람이 비동기식으로를 멀티 스레드와 같은 개념으로 이해하고 있지만~ 비동기와 멀티스레드는 다른의미 입니다. 비동기 프로그래밍은 단일스레드에서 작업효율을 낼수 있으며  작업관리자(Dispachter)에 의해 싱글/멀티 스레드로도 작동할지 조정할수도 있지만 플랫폼에 따라 싱글스레드로 제약이 있을수 있습니다.

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



나이키 드로우 이벤트 - 타임리밋 이벤트


PROBLEM

문제 : 나이키 드로우 이벤트에서는 타임리및 이벤트를 진행하며, 전설적인 상품의 경우 100만건 이상의 이벤트가 짧은 시간에 응모됩니다. 순식간에 발생하는 대용량 이벤트를, 초기 시스템은 처리하지 못하였습니다.


SOLUTION

해결 : 우리는 측정기를 빠르게 만들었고 그와함께 커스텀하게 부하를 줄수 있는 AKKA 분산처리 부하기를 만들었습니다. 그리고 로드밸런스및 발송기 처리률을 개선하여 나이키의 전설적인 이벤트를 안정적으로 처리하게 되었습니다.


AKKA 분산처리기

AWS의 기본 로드밸런스 , 순간 최대 TPS가 1024란 사실은 알기가 어렵습니다모르고 사용할수도 있습니다.  대용량 메시징 발송에서 1024는 너무도 작은 숫자이지만, 적은처리량일수 있고  일반적인 서비스에서는 충분한 숫자일수 있습니다.

AWS의 로드밸런스를 무력화시킬 로드테스트를 하려면 단일장비로는 트래픽유발하기가 어려우며 측정가능 부하기또한 분산처리 가 되어야 합니다.


성능측정


Warning

측정을위해  어느정도 자원이필요하지만, 성능을 위해 측정을 포기하는것은 바람직하지 않습니다.

측정을 하지못하면 개선 또한 할수 없습니다.

...

호출량이 모두 측정이되어야하며 유실또한 없어야합니다. 


참고기술

...

CRM서비스에서 유용한 실시간 이벤트는 불특정하게 발생하며, 배치가 아닌 스트리밍형태로 즉각 처리를 하기위해 AKKA가 부분활용되었습니다.

고성능 이벤트 처리기 

PROBLEM

문제 : 1000개의 이벤트가 1초내에 외부로부터 발생했다고 가정해봅시다. 1000개의 개별 이벤트를  DB를 순신간에 저장해야한다면 커넥션풀 1000개를 순식간에 소진할것입니다. 그리고 이것은 대부분 이벤트 대량 유실및 장애로 이어지게됩니다.


SOLUTION

해결 : 이벤트 적재의 저장소 라운드트립을 줄이기위해 FSMACTOR를 사용되었으며 위와같은 케이스에서 라운드트립 1이면 충분합니다. - Kafka와 연계되어 메시징 분산처리 성능및 보장능력을 더 개선할수 있습니다.

셀룩

...

상품 인덱싱 업데이트

...

루나 소프트의 야심찬 형제 프로젝트로 셀룩의 검색엔진에 데이터를 실시간 대량 인입을 하기위해서 도 그린앤 그레이 셀룩의 검색엔진 데이터 동기화 부문에서 준실시간 데이터 업데이트를 위해 FSMACTOR가 이용되었습니다.

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


FSM(유한 상태머신) ACTOR

...

Image Added

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

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




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

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

루나 상담센터는 젠데스크(게시판형CS처리) / 콜상담을포함 카카오상담톡,네이버톡톡 등을 모두 통합  옴니채널로 운영가능합니다.  멀티채널과 옴니채널은 다음과 같은 의미를 가지고 있습니다.

멀티 채널 : 단순하게 N개의 채널을 각각 이용할수 있음을 의미합니다.
옴니 채널 : N개의 채널을 단일지점을 통해 이용할수 있음을 의미합니다.


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

Image Modified

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

반송/회수/반품 문의가 이커머스 상담에서 항상 1,2위를 랭크되고 있는것을 알수 있습니다. 하지만 하위 랭크되는 단어도 다양한 의미를 가질수 있습니다.

  • 반품 - 회수 - 지역명  : 반품 CS에는 주로 지역명이 함께 언급됩니다.
  • 원피스-블라우스-사이즈-색상 : 언급되는 카테고리및 옵션들은 주요 트렌드가 될수 있습니다.
  • 퇴실/ 복숭아 : 패션뿐 아니라 다양한 산업군에서 루나톡을 사용하는것을 활용할수 있으며, 산업군 별로 트렌트 파악또한 가능합니다.
  • 고객감동 지표 키워드 : 중요한것은 고객 CS(CUSTOMER SERVICE)가 잘 처리되어, 고객이 CS(Customer Satisfied)하는것입니다. CS가 잘 마무리된 경우 "감사" 라는 단어가 랭킹 되며 루나톡에서 중위권에 언급되는 단어입니다.



Image Modified

Image Added

쇼핑 이커머스 대부분의 상담내용중 대부분은 상담접수는 교환/배송/반품이며 해당 CS처리를 위한 택배회수 챗봇기능이 제공됩니다. 


CRM EVENT GRAPH


이벤트를 단지 적재하고 통계를 내는것만으로는  부족하며,  GRAPH로 사용자 이벤트를 연결하여 시각화하여 고객의 불만뿐아니라 고객의 새로운 니즈를 찾아 낼수 있습니다.

...

View file
name루나톡-WORD.mp4
height400

우리 데이터팀의 최종목표는 B2B(루나톡) 과 B2C(셀룩)의 데이터를 연결하여 새로운 인사이트를 만들어내는것입니다. ( 준비중 )


이러한 데이터가 꼭 광고로만 활용되어야 할까요? 고객의 상담으로 획득한 키워드를 통해  우리 고객의 시즌별 상품 품질관리및 개선 아이디어에 대한 지표도 제공할수 있게됩니다. ( 준비중.... )


참고참고기술


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

...

Tell ( Forgot And Fire )

...

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


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

이후 챗봇에서 발생한 데이터를 활용하여 빠른 CS상담처리가 됩니다.  챗봇의 액션을 저장하기위해 고객은 그 시간을 기다릴 필요가 없습니다.

레거시를 위한 지원 - 메시지전송기능 지원

기존 레거시 시스템이 큐처리및 변경이 불가한경우,  API연결지점을 만들어 AKKA에서 제공하는 큐기능으로

메시지 순차처리및 메시지 우선순위(메일BOX) 같은것을 지원할수 있습니다.


다양한 메시지 전송 전략

...

상위 스트림에서  큐처리및 변경이 불가할때 , 중간 지점에서 메시지 처리시스템을 연결하여

다양한 메시지 전송 전략을 큐시스템을 이용하여 서비스 안전성및 성능을 높일수 있습니다.

Image Added


Image Added

가장 잘 알려진 라운드 로빈은 순차 분배이며, 다양한 라우터 전략을 사용하여 덜 바쁜 노드에게 작업을 우선 부여한다거나  작업 균등에 활용할수 있습니다. MailBox전략에서 다양한 메시지 우선순위를 부여할수 있습니다.

  • 라우터 : 분배가 되는 규칙
  • 라우티 : 분배가 된 메시지를 처리하는 작업 Node , 라우터의 목적지


활용가능한곳

  • 코드 변경불가 상위스트림에서, 상담 콜 이벤트의 순차 보장 
  • 상담 업무할당 균등분배 ( 준비중 )
  • 역압력을 고려 불규칙한 메시지를 균등처리 ( 역압력 스트림이 추가적용 )

...


링크:


마무리

...

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


AKKA는단지 분산처리에있어서 필요한 기본개념을 먼저 알려주고 이벤트중심 설계를 활용한 단순화된 개발모델을 제시하며

개발자는 그것을 이용하여 응용프로그램내에 직접 작성 할수있습니다. 그 중심엔 이벤트드리븐을 지원하는 액터가 있으며 선택가능한 수많은 스택중 하나입니다..


AKKA를 만든 라이트벤드가 주도하는 리액티브 서밋을 주목할 필요가 있으며, 카프카를 포함 리액티브를 선언한 오픈플랫폼 기업이 참여하고 있으며 AKKA종속적이지 않습니다.

정확하게는 리액티브 인터페이스 규약(OOP의 인터페이스)을 준수하겠다란 선언이며, 이것의 구현체가 블락없이 상호연동을 강력하게 하는것입니다.

다양한 글로벌 오픈 플랫폼이 참여를 하며 이벤트 중심의 대용량처리 아키텍처에 대한 발표내용을 주목할필요가 있습니다.

링크 :  https://www.youtube.com/@ReactiveSummit/videosAKKA는 OOP에서 디자인 패턴과 함께, 다양한 메시지 전송전략및 패턴을 학습할수 있는 좋은 툴킷으로


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


추가로 다양한 플랫폼에서 AKKA를 포함 국내외 Reactive 활동들을 페이스북 그룹을 통해 소개하고 있으니 더 많은 정보를 찾고자 할때 도움이 되었으면 좋겠습니다.

Image Added

링크 : https://www.facebook.com/groups/akkalabs


Next