관리 메뉴

HAMA 블로그

예제로 배우는 아카(akka) - Akka 시작하기 본문

Akka

예제로 배우는 아카(akka) - Akka 시작하기

[하마] 이승현 (wowlsh93@gmail.com) 2016. 10. 2. 14:05


Akka 시작하기


Akka를 광고하자면

처리율(throughput)   임백준님의 Akka 시작하기에서 발췌 

아카를 이용한 리팩토링을 끝마쳤을 때, 똑같은 컴퓨터 위에서 전과 동일한 몬테 카를로 시나리오를 수행하는데 걸리는 시간이 6시간에서 2시간으로 단축되었다. 66%의 시간이 절약된 것이다. 결과를 확인한 사람들은 깜짝 놀랐다. 단순히 자바 스레드에서 아카로 라이브러리를 바꾸었을 뿐인데 그렇게 엄청난 차이가 있을 수 있냐며 고개를 갸웃거렸다. 물론 이런 차이를 일반화할 수는 없다. 이런 결과 하나를 가지고 아카가 자바 스레 드보다 3배 빠르다고 말하는 어리석은 사람은 없을 것이다. 아카도 내부적으로 자 1 아카에 대하여 - 017 바 스레드를 사용하기 때문에 그런 비교 자체가 성립하지 않는다. 하지만 일반적 인 차원에서 짚고 넘어갈만한 부분도 있다. 이렇게 커다란 차이가 어디에서 비롯 되었는지 이해하려면 우선 암달의 법칙Amdahl’s law을 생각해볼 필요가 있다. 암달의 법칙은 이렇다. “멀티코어를 사용하는 프로그램의 속도는 프로그램 내부에 존재하는 순차적sequential 부분이 사용하는 시간에 의해서 제한된다.” Thread나 Task를 만들어서 ExecutorService에게 제출하는 식으로 동시성 코드를 작성하면 여러 개의 스레드가 동시에 작업을 수행한다. 하지만 프로그램 안에는 Thread나 Task가 포함하지 않는 코드가 존재한다. 여러 개의 스레드가 동시에 작업을 수행하더라도 synchronized 블록이나 데이터베이스, 네트워크 API 호출 등을 만날 때 다른 스레드와 나란히 줄을 서서 순차적으로 작업을 수행 해야 하는 경우도 있다. 암달의 법칙은 프로그램이 낼 수 있는 속도의 상한이 이런 순차적 코드가 사용하는 시간에 의해서 제한된다고 말하는 것이다. 이러한 순차적 코드의 또 다른 이름은 블로킹blocking 콜이다. 문제는 스레드 자체 가 아니라 스레드를 사용하면서 자기도 모르게 만들어내는 블로킹 콜이다. 조금 과장해서 말하자면 자바 개발자가 스레드를 이용해서 만들어내는 ‘동시성’ 코드는 일종의 신기루다. 사실은 코드 곳곳에 존재하는 블로킹 콜, 순차적 코드 때문에 전 체적인 프로그램의 처리율은 이미 상한이 정해져 있지만 여러 개의 스레드가 ‘동 시에’ 동작한다는 사실로부터 위안을 받을 뿐이다.

정의

Akka

위키백과, 우리 모두의 백과사전.

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

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

역사[편집]

Philipp Haller에 의해 작성된 actor 구현은, 2006년 7월에 스칼라의 2.1.7의 일부로 릴리즈 되었다.[2] 2008년 스칼라는 복잡한 서버 애플리케이션에서의 사용에 대해 주목하였지만, 동시성은 아직도 스레드(thread)-공유 메모리(shared memory)와 락(lock)을 필수적으로 사용하여 싱크를 맞추는-를 생성하는 전형적인 방식으로 이뤄지고 있다 . 이러한 접근 방식으로 생겨나는 어려움을 인식하고 얼랭 프로그래밍 언어의 라이브러리가 지원하는 고도의 동시성 쓰기, 이벤트 주도 애플리케이션으로부터 영감을 얻어, Jonas Bonér가 스칼라와 자바에 유사한 기능을 도입하기위해 Akka를 만들었다. Bonér는 2009 년 초부터[3] Akka를 작업하기 시작했고, 그 해에 그것에 대한 그의 비전을 작성했다.[4] 첫 공식 릴리즈는 Akka 0.5로,[5] 2010년 1월에 발표되었다.[6] Akka 이제 Play 프레임워크, 스칼라 프로그래밍 언어와와 함께   Lightbend 플랫폼의 일부이다.

특징[편집]

Akka actor를 기반으로하는 애플리케이션의 구별되는 특징은 다음과 같다:

  • 동시성은 메시지 기반이며 비동기 방식으로 이루어진다: 일반적으로 변형 가능한 데이터를 공유하거나 동기화되는 primitive를 사용해서는 안됩니다: Akka는 액터 모델을 구현한다.
  • 동일한 호스트든 분산된 호스트들이든, 직접 통신하든, 몇몇 혹은 다수의 스레드 상에서 동작하는 라우팅 채널을 이용하여 통신하든, 혹은 이외의 방법으로 통신을 하든 actor들이 상호작용하는 방식은 동일하다. 이러한 세부사항들은 프로그램이 수정 없이 스케일-업(더 성능이 뛰어난 서버를 사용)하거나 스케일-아웃(더 많은 서버를 사용)하기 위해 배포 시점의 구성 메카니즘에 따라 변경할 수 있다.
  • Actor들은 프로그램의 오류를 연관성에 따라 계층적으로 분류한다. 이 오류들은 actor의 supervisor의 이벤트로 처리된다(어느 actor가 오류를 발생했다는 메시지인지를 가리지 않음). 얼랭과는 대조적으로 Akka는 parental supervision을 강조한다. 이는 각 actor가 parent actor에 의해 생성되고 감독받는 것을 의미한다.

Akka는 actor를 제공하는 코어 모듈을 포함한 모듈 구조를 띄고 있다. 다른 모듈들은 actor의 네트워크 분산, 클러스터 지원, 명령과 이벤트 소싱, 다양한 서드 파티 시스템과의 통합(예, Apache Camel, ZeroMQ), 심지어 Futures, Agents같은 다른 병렬성 모델을 지원하는 것과 같은 기능을 추가하는 것이 가능하게 한다.

하마 블로그 akka 시작전 읽어 볼만한 글  

생성자-소비자 패턴 과 액터 

Actor ? ActiveObject? Akka? 

시작하기 좋은 서적 

임백준님의 아카 시작하기를 읽어보세요.  가격도 저렴하고 간결하게 필요한 부분만 정리 되어 있습니다.
이 책 한번 읽고 아카 (akka.io)에가서 예제 하나씩 해보면 됩니다.


chapter 1 아카에 대하여 
    처리율 
    스케일 아웃 
    모듈화 
    차세대 동시성 모델 


chapter 2 핑퐁 게임 
    핑퐁액터 
    액터시스템 만들기 
    액터 만들기 
    ActorRef 
    장소 투명성 
    메시지 전송 
    메일박스 
    onReceive 
    액터 라이프사이클 


chapter 3 아카 계층구조 
    아카 계층구조 
    보내고 잊기 
    작업의 완료 
    메시지 순서 
    테크닉 
    액터의 내부 상태와 스레드 


chapter 4 고장 나도록 허용하라 
    고장 나도록 허용하라 
    SupervisorStrategy 
    Resume 
    Restart 
    Stop 
    Escalate 
    기본 감시전략 
    재귀와 연대책임 
    chapter 5 액터와 상태기계 
    액터의 상태 
    상태기계 


chapter 6 라우터 
    라우터 
    라우터와 감시전략 
    풀과 그룹 
    라우팅 알고리즘 


chapter 7 퓨처와 에이전트 
    퓨처 
    예제코드 
    블로킹 호출 
    난블로킹 호출 
    에이전트 


chapter 8 클러스터 
    클러스터 
    코드 
    구성파일 
    actor.provider 
    actor.remote 
    actor.cluster 
    deployment 

Comments