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




AKKA 채택이유?



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

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

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


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

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

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


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

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


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

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

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


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


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

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

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

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

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

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

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

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

정리된 자료 : UnitTest For Actor Message


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

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

해결사례와 적용사례


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

스마트 플러스 상품연동

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


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

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

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

참고 아티컬 :



AKKA Dispatcher

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

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

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



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

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



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


PROBLEM

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


SOLUTION

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


AKKA 분산처리기

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

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


성능측정


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

측정을 하지못하면 개선 또한 할수 없습니다.호출량이 모두 측정이되어야하며 유실또한 없어야합니다. 


참고기술


이벤트 실시간 적재및 분석

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

고성능 이벤트 처리기 

PROBLEM

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


SOLUTION

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

셀룩 상품 인덱싱 업데이트


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

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


FSM(유한 상태머신) ACTOR


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

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




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

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

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

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


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

문장분석기를 액터에 탑재하여 ,  실시간으로 고객의 상담 트렌드를 빠르게 파악할수 있으며

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

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



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


CRM EVENT GRAPH


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

원피스와 운동화는 도대체 어떠한 연관이 있을까요?  - 루나 데이터 분석팀

실제 상담내용으로  "고객 : 혹시 아래 나이키 신발과 어울릴만한 스커트나 원피스 있을까요? 많이 걸어야하고 아이가 어려 신발은 편한걸 신어야하는데 오랜만에 스커트가 입고싶어서 구매하려고 합니다.

제가 둘러보았는데 코디때문인지 모던하고 여성스런스타일이라 저신발엔 어울릴지 모르겠어서 챗드려요"  - 원피스복장에도 운동화를 찾는 고객의 니즈가 있음

루나톡-WORD.mp4


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


참고


기다림이 없는 메시지 전송 - Tell ( Forgot And Fire )


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


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

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


다양한 메시지 전송 전략


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

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


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

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


활용가능한곳

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


링크:


마무리


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


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

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


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

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

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

링크 :  https://www.youtube.com/@ReactiveSummit/videos


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


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

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


Next 




  • No labels
Write a comment…