티스토리 뷰

Akka

Akka의 기본적인 내용

sungjine 2018. 4. 21. 20:59
반응형

Akka는 액터 모델을 이용하여 병행 및 분산처리를 효과적으로 할 수 있게 도와주는 라이브러리다.


 * 액터 모델이란 정해진 수의 액터가 있고 액터는 메시지를 가질 수 있고 메시지에는 액터를 받았을 때 해야되는 동작을 담을 수 있다. 그리고 이러한 액터를 통해서 메시지를 주고 받는 형식을 뜻한다. 또 액터를 주고 받는 과정에서 순서에 상관없이 동작하며 서로의 상태를 공유하지 않는다.


Akka는 Java의 Thread를 이용해서 만들어졌지만 Thread와 차별화되는 점은 동기적 방식을 제한하고 비동기적인 방식을 사용하는 것이다. 그리고 액터 모델의 특징을 가지고 있어 데드락이나 락에 대한 걱정을 하지 않고 병행처리를 할 수 있다.


Akka를 사용하기 위해서는 ` ActorSystem("TestSystem") `를 통해서 액터 시스템의 인스턴스를 만들어야하고 하나의 액터 시스템 안에서 동작하는 액터들은 스케줄링, 구성파일 등을 공유하기 때문에 액터를 담기 위한 컨테이너라고 생각하면 될 것 같고 "TestSystem"은 액터 시스템의 이름이다.


그 다음 액터 시스템에 액터를 만들 때는 ` actorSystem.actorOf(Props(new PingActor)) `를 통해서 만드는 데 여기서 Props는 액터를 만들 때 필요한 구성요소를 담고 있는 클래스로 변경할 수 없고 공유가 자유롭다. Props를 통해서 액터를 만드는 방법은 세 가지가 있는데 아래와 같다.


val props1 = Props[MyActor]

val props2 = Props(new ActorWithArgs("arg"))

val props3 = Props(classOf[ActorWithArgs], "arg")

 * 인자를 가지는 Props의 경우에는 권장하지 않는다고 한다.


그리고 actorSystem.actorOf(Props(new PingActor)) `에서 new PingActor는 Props를 통해서 만들어지는 액터이다. 그리고 만약에 액터의 이름을 만들고자 할 때는 actorSystem.actorOf(Props(new PingActor), "actorName") `


위와 같이 만들어진 액터는 PingActor 타입이 아니라 ActorRef 타입인데 PingActor를 Prop을 통해서 만드는게 아니라 그냥 인스턴스를 생성하면 에러가 발생하며 캐스팅을 하려할 때 또한 에러가 발생한다. 때문에 PingActor에 ActorRef에서 상속받은 메서드가 아닌 public한 메서드를 만들어도 접근할 수 있는 방법이 없기 때문에 사용할 수 없다.


 * PingActor는 Actor를 상속해야 한다.


이 외에 아카에는 Location Transparency 라는 개념이 있는데 이는 액터가 물리적으로 어디에 존재하는지 알 필요가 없다는 뜻이다.


그리고 액터를 통해 메시지를 전송하는 방법은 tell과 ask 메서드가 있는데 tell은 메시지를 전송하고 바로 결과를 반환받고 ask의 경우에는 결과를 Future로 감싸서 반환하며 두 방법 모두 비동기로 동작한다. 즉 성능을 위해서는 tell을 사용해야하고 필요할 때만 ask를 사용하면 된다.


위에서 설명한 것과 같이 액터는 메시지를 전송하면 액터에서 재정의한 receive 메서드를 실행한다.


액터의 생명주기는 생성, 재생성, 종료가 있는데 재생성이라는 것은 액터시스템 어디선가 에러가 발생했을 때 다시 시작하는 것을 의미한다.


 preStart      : 생성자가 완료된 직후에 실행된다.

 preStop      : 액터의 라이프사이클이 완전히 종료하기 직전에 실행된다.

 preRestart   : 재시작이 이루어지기 직전에 실행된다.

 postRestart : 재시작이 이루어진 직후에 실행된다. 


참고 문서 : 

1. 임백준의 아카 시작하기 : Akka 개념 잡기

2. Akka Documentation

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31