임백준의 Akka 시작하기 를 읽고...

2016. 5. 26. 08:27Java/Akka


http://www.hanbit.co.kr/store/books/look.php?p_code=E3400029901


회사에서 신청해 놓고 잊고 있던 e-book 

문득 생각이 나서 , 읽어 봤는데, 하루 정도 천천히 읽으면 다 읽을수 있고, 코드도 그렇게 어렵지 않게 작성해 놓았다.

실제 이 책을 읽는 것을 Akka에 대한 기본 개념을 잡는 정도로 보면 될것 같다.


실무에서는 복잡한 클러스터 환경상에서 효율이 보다 좋은 것에 대한 고민을 하게 된다.

효율이라는 것은 바로, 분산 컴퓨팅, 확장성, 동시성, 반응형과 같은 요소들에 대한 고려라고 한다. 

단순하게 하나의 웹서버을 사용할 때와 다르게 수만의 동시다발의 요청에 대한 통신 처리를 위해 

NodeJS, Netty, Vert.x, Akka 등을 활용하면, 효율성에서는 엄청난 차이를 보이겠지만,

프로젝트에 참여하는 인원과 어느 환경에서나 쉽고, 빠르게 적용, 그리고 이후 유지 보수 비용 등의 판단이 중요했다. 


정말 읽기 전에는 Akka 라는 것에 대해서 알고 있던것은 

Vert.x 나 NodeJS 와 같은 비동기(Asychronous) 이벤트 기반 통신 라이브러리 이겠구나 했다.

하지만 조금씩 다른 부분들이 눈에 띄이기에 아래와 같이 정리를 좀 해봤다. 

-------------------------------------------------------------------------------------------------------------------------

Akka나 비동기 메세지 기반 라이브러리를 사용함에 있어서, 중요 포인트로 모든 것이 Asychronous 라는 점만 기억하자.

지금까지의 동기적인 프로그래밍의 이해에서 벗어나야 한다. 


우선 ActorSystem이라는 컨테이너 객체를 만드는데, 모든 Actor는 어떤 ActorSystem 내부에서 동작을 수행한다.

(스레드 스케줄링, 구성파일, 로그 서비스 등을 공유한다.)

이 ActorSystem 안에서 Actor를 생성한다. 생성된 Actor는 또다른 Actor를 생성할수 있고, 결국 Tree 구조 형태로 구성가능하다.

이때 만들어지는 Actor는 결국 ActorRef 안으로 감싸져 있다.

또한 감싸진 객체의 메서드를 직접 호출할 수 없고, 오직 메세지를 전달 할 수 있을 뿐이다.


Akka 의 장점

- 반응성(responsiveness) : 빠르게 응답하는 것이다. nonblocking/asynchronous 에 따른 시간의 절약을 보장한다.

- 탄력성(elasticity): 유연한 스케일을 보장한다. Scale out 을 자동으로 보장해준다. (자동까진 그렇고, 구성파일 설정에서 가능하다).. 확장성이란 말에는 Scale-down이 포함이 안되어 있다보니..

- 유연성(resilience)  : 장애 허용와 관련, 장애나 에러 발생시에 그런 사실에 구애받지 않고, 일관성있는 반응성을 유지
    replication(중복), isolation(격리), delegation(대리)와 같은 기법 사용 

- 메시지 중심(message-driven) : event-driven 에서, 메세지 중심으로 한 것은, 사건은 목적지가 없지만, 메세지는 목적지가 있기 때문.

- 모듈화 : 아카세계에서의 컴포넌트는 Actor 이고, 이 Actor는 서로 완벽하게 독립적이며, 코드의 응집성, 느슨한 결합, 캡슐화와 같은 프로그래밍 원리를 와벽하게 구축한다.

- Java 보다 추상수준이 더 상승된 것으로 보면 어떨까? 


Akka 의 특징 

- Actor의 메일박스,Dispatcher에 의한 thread 할당 

- Actor 간의 메세지 송수신 및 라이프 사이클

- try,catch와 달리, 어느 액터가 발생시킨 예외는 그 Actor의 supervisor가 곧바로 처리하겠다라는 strategy.

- if-else 구문 대신에 상태기계을 이용하여 처리(Procedure 객체)... 

- 병렬 처리 매카니즘의 router을 통해 쉽게 확장

- 메세지를 보내고 잊지 않고 트래킹할 때 사용되는 future (Patterns.ask).. nonblocking 가능한 onSuccess,onComplete,onFailure

- Actor와는 다르게 값(상태), 동작을 동시에 포함하는 것에 비해 , 내부 코드가 없는 Agent는 값(상태)만 포함

- 구성파일 설정을 통한 clustering 구현 

-----------------------------------------------------------------------------------------------------------------------------------------------

실무에서 사용하는 것에 대한 내용, Java로 코딩하지 않고 Scala를 이용해서 코딩하는 수준으로 나아가야 한다는 생각이다.



* 암달의 법칙(Amdahl's law) : 멀티코어를 사용하는 프로그램의 속도는 프로그램 내부에 존재하는 순차적 부분이 사용하는 시간에 의해서 제한된다.

몬테카를로 시뮬레이션 ( monte carlo simulation) : 불확실한 상황에서 의사결정을 위해 확률적시스템의 모의 실험에 이용되는 절차 랍니다.