Netty(네티)

Netty 네티의 이벤트 루프 - 단일 스레드와 다중 스레드의 장단점, 네티의 단일 스레드와 다중 스레드

알통몬_ 2017. 12. 22. 11:39
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이벤트 루프 :

이벤트 기반의 애플리케이션에서 이벤트를 처리하는 방법에는 크게

두 가지가 있습니다.


하나. 이벤트 리스너와 이벤트 처리 스레드에 기반한 방법.

=> 대부분의 UI 처리 프레임워크가 사용하는 방법입니다. 

이벤트를 처리하는 로직을 가진 이벤트 메서드를 

대상 객체의 이벤트 리스너에 등록하고 객체에 이벤트 발생 시 

이벤트 처리 스레드에서 등록된 메서드를 수행합니다.


둘. 이벤트 큐에 이벤트를 등록한 후 이벤트 루프가 큐에 접근하여 처리하는 방법

=> 하나. 의 방법에 비해서는 프레임워크 구현이 복잡하지만, 

사용자 입장에서 보면 보다 간단하게 사용할 수 있습니다.


단일 스레드와 다중 스레드

단일 스레드 이벤트 루프:

 이벤트를 처리하는 스레드가 하나인 상태를 말하고, 

이벤트 루프 구현이 복잡하지 않고, 예측 가능한 동작을 보장합니다. 

그리고 하나의 이벤트 큐에 입력된 이벤트를 처리하기 때문에 

이벤트가 발생한 순서대로 수행할 수 있습니다.

하지만, 다중 코어 CPU를 효율적으로 사용할 수 없고, 

이벤트 메서드에 처리 시간이 오래 걸리는 작업이 포함되어 있다면 

나중에 들어온 이벤트의 처리가 오랜 시간 걸린다는 단점이 있습니다.

이러한 단점을 극복하기 위해 다중 스레드 이벤트 루프를 사용하기도 합니다.

다중 코어를 가진 서버에서 node.js 같은 단일 스레드 이벤트 루프를 

사용하는 애플리케이션을 효율적으로 운영하기 위해 한 개가 아닌 

여러 개의 인스턴스를 실행하는 경우도 있습니다.


다중 스레드 이벤트 루프 :

 말 그대로 이벤트를 처리하는 스레드가 여러 개 입니다. 

단일 스레드 이벤트 루프에 비해프레임워크 구현이 복잡합니다. 

스레드들이 이벤트 메서드를 병렬로 처리하기 때문에 

다중 코어CPU를 효율적으로 사용하지만, 

여러 이벤트 루프 스레드가 이벤트 큐 하나에 접근하기 때문에

여러 스레드가 자원 하나를 공유할 때 발생하는 스레드 경합이 발생합니다.

또한 여러 스레드에서 이벤트 메서드를 수행하기 때문에 

이벤트의 발생 순서와 실행 순서가 일치하지 않을 수 있습니다. 

그리고 스레드의 갯수를 너무 많이 설정하거나 설정하지 않게 되면 

과도한 가비지 컬렉션이 발생하는 원인이 되기도 하고 

OOM(Out Of Memory) 에러를 발생 시켜서 애플리케이션이 

정상적으로 동작하지 못하게 됩니다.


네티의 이벤트 루프 :

 네티는 단일 스레드 루프와 다중 스레드 루프 둘 다 사용할 수 있습니다.

다중 스레드 루프의 경우 일반적인 다중 스레드 루프에서 

이벤트 발생 순서와 실행 순서가 일치하지 않는 경우가 발생한다고 했지만,

네티에서는 이벤트 루프 종류에 상관 없이 

이벤트 발생 순서에 따른 실행 순서를 보장해줍니다.


일반적인 다중 스레드 루프는 아래와 같은 구조로 되어 있어서,

 발생 순서와 실행 순서가 일치하지 않는 경우가 발생하게 됩니다.


네티의 다중 스레드 루프는 아래와 같은 구조로 되어 있어서 

항상 발생 순서에 따른 실행 순서를 보장합니다.


이상입니다.


감사합니다.


반응형