본문 바로가기
Java/Akka

akka 를 사용하면서 이슈발생...

by java개발자 2015. 7. 24.

eclipse 에서 java 로 akka를 사용하다보니 예상치 못한 에러가 발생한다.

1.

onReceive 안에서 

현재 클래스의 전역변수를 참조할 때, 

this.변수 를 사용하지 않고,

암묵적으로 단순히 변수명만 사용하면

예상치 못하게 그 변수의 초기값이 참조된다. 왜지????

분명 지역변수를 사용하지는 않는다.

(스칼라의 클로저가 작동한건 아니겠지???-_-;;)

> 밑에 4번과 같은 문제인듯...

2.

값자기 잘되던 소스에 에러가 난다.(빨간줄..)

import 하라고 하는데,,,

음. import 할 필요가 없는 상황인데 말이다.

프로젝트 clean 하니 해결되었다.

> akka 가 scala로 작성되어서 그런지 좀... 이상하다....

3.

akka를 실행하고 나서

따로 shutdown 해주지 않고, 계속 테스트(실행)하다보면,,

작업관리자에 java 프로세스가 몇개씩 남아있다.-_-;;

4.

재귀적인 느낌으로 자기 자신을 호출(tell)할 경우

onReceive 했을때 전역변수를 확인해보면 리셋되어 있다.-_-;;;

> 호출(tell)할 때 액터 생성시 문제가 있었다.

1. ActorRef conn = context().actorOf(Props.create(B_AkkaController.class));

2. ActorRef conn = getSelf();

//1
ActorRef conn = context().actorOf(Props.create(B_AkkaController.class));
//2
ActorRef conn = getSelf();

첫번째 코드처럼 하면, 새로운 클래스가 생성되어서, 기존의 전역변수를 재활용 할 수 없다.

두번째 코드로 해야 계속 유지가 된다.

5.

A -> B1

A -> B2

A -> B3

A -> B4

....

A <- B1, B2, B3, B4,,,,,

B를 동시에 100개로 멀티쓰레드 구성을 한다면,,,

뭐,,, 동작은 하지만...

뭐,,, B도 100개가 동작하겠지만...

A가 문제다.

A의 onReceive 에서 100개의 reply를 Queue의 동기식으로 처리하기 때문에

멀티쓰레드의 결과를 onReceive에서 받을 때 지연이 발생한다....이런;;;


결국.... 맵리듀스 문제가 다시 불거진다;;;

포크 앤 조인을 찾아봐야 하나???

...

분명 분산처리를 위해서 멀티쓰레드를 사용하는 것이 맞는데

결과들을 다시 합치는 과정으로 데이터 무결성을 보장하기 위해 싱글쓰레드 하면,

속도 지연이 심각하다-_-;;;;.