JAVA

Akka

k9e4h 2019. 5. 7. 14:43

Akka API Documentation : https://doc.akka.io/japi/akka/current/index.html?akka/actor/package-summary.html

 

Concurrrent Programming - 병행 및 분산distributed 처리 프로그래밍 

 

multi thread progmamming시 동기화 처리 문제로 인한 것을 해결

액터는 데이터를 서로 공유하지 않는 것을 원칙으로 하기 때문에 데드락이나 락에 대한 고민을 줄여줌

 

- 액터들은 상태를 공유하지 않는다.

- 액터들 간의 통신은 메세지 전달을 통해서 이루어진다.(이벤트 기반 모델)

- 액터간의 통신은 비동기로 이루어진다.

- 각 액터는 전달받은 메세지를 큐에 보관하며, 메세지를 순차적으로 처리한다.

- 액터는 일종의 경량 프로세서다.

 

Akka - 오픈 소스 툴킷, JVM 상의 동시성과 분산 어플리케이션을 단순화

actor의 특징

- 다른 액터에 한정된 개수의 메세지를 보낼 수 있다.

- 유한한 개수의 액터를 만들어낼 수 있다.

- 다른 액터가 받을 메세지에 수반될 행동을 지정할 수 있다.

- 이러한 모든 일이 동시적으로 일어난다.

 

Akka란 Actor 기반 시스템의 한 구현체

Actor : 메세지를 주고 받을 수 있는 단위

Actor간의 통신을 메세지 수신으로써 처리함

Actor간의 메소드 직접 호출이 있어서는 안된다.

Life cycle이 유지되고 있는 Actor에 대한 메소드 호출은 동기화가 깨진다.

Akka는 메소드 직접 호출보다는 느리지만, 메세지 큐를 통한 접근 스레드를 하나만 유지함으로써, 멀티 스레드 동기화 이슈를 우회하는 접근이다.

주체적으로 동작하는 개체를 여러 개로 두면서도(= 멀티 스레드로 로직이 동작하면서도) 스레드 동기화에 대한 이슈를 제거했다.

Akka는 인프로세스 메세징 큐를 사용하는 것보다 좀 더 고차원적인 병렬 처리왕 fail-over, persistence 등을 지원한다.

 

멀티스레드 로직 프로그래밍 - lock이 길어지거나 spin-lock이 발생, 경합, 데드랑이 발생하기 쉽다.

 

akka는 scala로 구현된 concurrency 제어를 위해 actor model을 도입한 프레임워크로 java와 scala API를 제공한다.

akka는 actor model을 기본으로 하고있기 때문에 akka의 특성을 이해하려면 actor model을 이해해야한다.

 

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

 

액터 모델 자체에 대한 개념은 사실 어렵지 않습니다만 막상 Akka를 기존의 시스템에 도입하려면 패러다임의 전환이 필요하다고 하네요. 단순히 병렬적으로 동일한 일을 나눠 하는 Worker 모델이나 IO에 블록킹 될만한 부분을 백그라운드로 돌리는 정도가 아닌 독립적으로 실행 가능하게 비즈니스 로직을 나누어 설계하고 메시지 교환이 필요한 부분을 최소화하여 액터로 설계해야 하기 때문입니다

 

암달의 법칙(Amdahl's law) :

 

Java같은 OOP를 지원하는 언어에서는 객체간의 레퍼럴스 참조를 통한 상대 객체의 메서드 실행을 "메세지를 주고 받는 것"이라고 설명함. 액터 모델은 완전하게 독립된 액터와 상호 간의 메세지 교환을 통해서 충실하게 객체지향 원리를 따르면서 멀티코어 환경에서 요구되는 동시성까지 지원할 수 있는 개념이라고 볼 수 있음.

http://blog.naver.com/tmondev/220528821645

 

Akka는 액터 모델을 구현한 라이브러리. 액터를 활용한 동시성 코드를 작성하는 것을 가능하게 해줌. 액터는 쓰레드 혹은 객체와 구별되는 추상이다. 액터가 차지하는 메모리 공간은 어느 다른 쓰레드 혹은 액터가 접근할 수 없다. 액터 내부에서 일어나는 일은 어느 누구와도 공유되지 않는다.

 

멀티 스레드 프로그래밍 중에는 많은 문제에 봉착할 수 있습니다. 가장 대표적인 문제는 공유 리소스 접근입니다. 힙에 저장된 변동될 수 있는 공유 리소스를 여러 스레드에서 활용할 경우, 경합을 방지하고 한 번에 한 개의 스레드에서만 활용하도록 lock과 같은 제약을 사용해 임계 구역을 만듭니다. 하지만 lock을 사용하는 순간부터 개발자는 여러 상황을 생각해야 합니다. lock이 빠진 곳은 없는지, 교착 상태(deadlock), 기아상태(starvation)는 발생하지 않는지, 또 암달의 법칙에 의한 성능 향상 한계점도 고려해야합니다.

 


actor model 과 akka

https://blog.seulgi.kim/2014/04/actor-model-and-akka.html

 


ActorSystem : actor를 내부에서 생성하고 동작하게 담고있는 컨테이너, 하나의 ActorSystem은 같은 JVM 안에서 돌아간다. ( Actor를 생성하기 위한 Factory이다.)

actorSystem에서 actorOf라는 함수를 사용해 actor를 생성

ActorRef : Actor의 주소를 담고 있는 데이터 형, Actor는 해당 객체로 직접 접근하여 public method를 쓰는 구조가 아니라 해당 actor의 주소로 서로의 메세지를 던져서 해당 함수를 호출하는 방식, actorOf 매서드는 Actor를 생성하는 메서드, Props 객체를 통해 Actor를 생성한다. 

ActorRef의 tell 메서드를 이용하여 메세지를 보낼 수 있따.

 

반응형

'JAVA' 카테고리의 다른 글

Java Resource File Path  (0) 2020.04.22
Java Exception  (0) 2019.05.16
Java Null  (0) 2019.04.09
Java 메모리 구조  (0) 2019.04.07
ISO 8601 시간 형식  (0) 2019.04.06