인프런 커뮤니티 질문&답변

jay님의 프로필 이미지

작성한 질문수

AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)

수직 vs 수평 확장 - Vertical vs Horizontal Scaling

자바 스프링 개발자입니다.

작성

·

216

·

수정됨

1

안녕하세요. 강의 너무 잘듣고있습니다. node 기반의 강의이기에 pm2 등의 내용을 듣고있던 중, 궁금한 부분이 있어 문의드립니다.

  • 1개의 vm에서 pm2을 사용하여 nodejs app을 2개를 올리고 있습니다. 제 생각에는 nodejs가 싱글스레드여서 vm의 cpu 개수만큼 사용하기 위해서 app을 여러 개를 띄운다로 이해하였습니다. 맞을까요?

  • 맞다면, 스프링의 경우에는 멀티스레드로 제공하기 때문에 위와 같이 1개의 vm에 여러개의 app을 띄울 필요가 없이 1개의 vm에 1개의 app만 띄우면 위와 같은 동작을 기대할 수 있다고 생각했습니다. 맞을까요?

  • 1개의 vm에서 여러 개의 스프링부트 app을 띄워야한다면 pm2와 같은게 필요한거 같은데, 스프링에서 pm2와 같은게 있을까요?

노드 기반 강의이기에 조금 아쉬운 부분은 있지만, 강의 재밌게 듣고있습니다. 감사합니다!

답변 1

0

김시훈님의 프로필 이미지
김시훈
지식공유자

좋은 질문입니다

 

스프링 개발을 안해봐서 확실하지는 않지만 제가 알기로 자바 PM2 같은게 필요가 없을거에요. 자바 자체에서 요청이 들어올 때마다 요청별로 하나의 스레드를 생성해주니깐요.

 

하지만 "PM2 + 노드 == 자바 스프링" 이렇게 1대1 적용은 아니긴 합니다. 노드는 각 프로세스가 싱글 스레드이긴 하지만 non blocking event loop 아키텍처이기 때문에 하나의 스레드가 수만개의 요청을 동시에 처리가 가능하니깐요. 그에 반면 자바의 스레드는 하나의 요청(blocking)만 처리하는걸로 알고 있습니다.

 

한개의 노드 프로레스가 수만개의 요청을 받을 수 있음에도 불구하고 PM2를 사용하게 되는 경우에는 CPU 코어가 여러개 있을 때입니다. 스레드 특성상 한개의 스레드가 여러 CPU를 사용할 수 없거든요. 그래서 보통은 성능 문제보다는 고가용성을 위해 PM2를 사용합니다. 예를 들어 배포할 때 3개의 프로세스가 있으면 순차적으로 배포하면 down time 없이 배포할 수 있게 되죠. 혹은 장애가 발생해서 프로세스가 하나 죽더라도 다른 복구하는 동안 다른 프로세스들이 분담해서 요청을 처리할 수 있게 되고요.

 

강의를 좀 보시면 PM2 안쓰고 VM을 여러개 쓰는걸로 발전시킵니다. 여기서부터는 싱글스레드이든 아니든 모든 언어에 동일하게 적용됩니다! VM 안에 여러 프로세스를 뛰웠어도 VM 자체가 죽으면 안에 아무리 많은 프로세스를 뛰워도 다 죽기 때문이죠. 그래서 제일 아랫단에 있는 VM 자체를 여러개 더 나아가서 각 VM여러 데이터센터(Availibility Zones)에 분산해서 배포합니다. 혹시라도 정전이 발생해서 데이터센터 자체가 문제가 될 수 있는 상황을 대비하는거죠. 몇년 전에 카카오에서 한개의 데이터센터 레벨에서의 분산이 올바르게 안되서 심각한 문제가 있었죠.

PM2는 이런 고가용성 개념을 배우기 위한 진검다리라고 생각하시면 좋을듯 합니다

jay님의 프로필 이미지

작성한 질문수

질문하기