You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 19 Next »

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

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

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


Akka - 위키백과

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

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


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

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

동시성 처리및 병렬처리

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

  • 동시성 : 한사람이 커피주문 받고 만들기를 동시에한다. ( 커피머신을 이용하면서도 주문을 받음)
  • 병렬성 : 커피주문을 받는사람과 만드는 사람이 각각 따로 있다. 
  • 순차성 : 한사람이 커피주문을 받고 커피를 만들지만~ 커피가 완성될때까지 다음손님 주문을 받지 못한다.


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

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

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


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

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


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

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


암달의 법칙

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


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

  • DeadLock(교착상태)
  • Starvation(빈곤)
  • LiveLock
  • Race Condition



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

Actor의 메시지큐와 Dispatcher

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


해결사례와 적용사례


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


스마트 플러스 상품연동

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


AKKA Dispatcher

Akka Dispatcher를 활용하면, 멀티스레드 프로그래밍을 할 필요없지만 다중스레드를 안정적으로 작동시키게 됩니다.

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


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

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

AKKA 분산처리기

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

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


성능측정

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


참고기술


이벤트 실시간 적재및 분석

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

고성능 이벤트 처리기 

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

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

셀룩 상품 인덱싱 업데이트


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

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


FMS ACTOR


배치처리기의 업데이트 주기를 큰 성능 저하없이 단축을 할수 있으며 , Flush 시간에따라 실시간에 가깝습니다.



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

단순하게 매크로 기능뿐만 아니라, 고객이 사용한 상담단어는 곧 트렌드가 될수 있습니다.


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

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

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

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



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

CRM EVENT GRAPH


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

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

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

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

루나톡-WORD.mp4


참고기술


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


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


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

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



다양한 메시지 전송 전략


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

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


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


활용가능한곳

  • 상담 콜 이벤트의 순차 보장 
  • 상담 업무할당 균등분배


링크:


마무리


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

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

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

AKKA는 OOP에서 디자인 패턴과 함께, 다양한 메시지 전송전략및 패턴을 학습할수 있는 좋은 툴킷으로


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




  • No labels