사용하시는 언어/프레임워크에서 비동기 처리를 사용할 때 주의해야할 점이 있나요?
사용하시는 프레임워크에서는 비동기 처리시 스레드 관리는 어떻게 해야하나요?
적절한 스레드 수 설정 + 적절한 대기 큐 수 관리
예를 들어, 회원가입 시 메일까지 보내야 하는 작업이면 - 이 메일보내는 작업은 회원가입과 분리된 작업이라 비동기로 수행
Coroutine과 스레딩 모델의 차이
스레드를 만들고 뭘 해주는 건가?
Java에서는 스레드 풀을 왜 사용할까?
요청마다 스레드를 생성하면, 스레드 생성 비용이 크기 때문에 OOM 발생
최대로 생성할 수 있는 스레드를 설정한다면, 스레드 풀 사용과 스레드 생성하는 것과 둘이 비슷할까?
nope…
스프링은 스레드를 누구로부터 받아오는 건가요?
JVM이 자원을 OS로부터 받아서, 톰캣(WAS)은 JVM으로부터 자원을 받아 스프링 부트에 넘겨준다.
적절한 스레드 개수는 어떻게 정하나요?
사용하는 환경에 따라서 다르게.. Hikari pool 공식 같은 것도 있다.
동기와 비동기, 블로킹과 넌블로킹의 차이는 무엇인가요?
동기와 비동기는 작업 완료 여부에 대한 관점이고, 블로킹과 넌블로킹은 호출한 함수가 반환될 때까지 기다리는지 여부에 대한 관점입니다. 동기적인 작업은 블로킹 또는 넌블로킹이 될 수 있으며, 비동기적인 작업은 주로 넌블로킹입니다.
동기/비동기는 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점이고,블로킹/논블록킹은 단어 그대로 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다.
블로킹 논블로킹 → 제어권을 넘기는지 안넘기는지 차이. 블로킹은 제어권을 넘기고, 논블로킹은 제어권을 넘기지 않는다.
Callback 이 무엇인가요?
각 환경에서 콜백을 어떻게 활용하나요?
java : 콜백 개념은 존재하지 않음. 콜백 패턴을 통해서 구현할 수는 있음
js
클로저
A메소드가 async B 메소드에게 C라는 콜백 메소드를 넘겨줌 A가 종료될 때 지역 공간이 삭제 됨 → 대신 C메소드가 A에 대한 정보를 가지고 있게되ㅏㅁ
Callback은 언제 사용하면 좋을까요?
callback을 사용했을 때 단점?
클로저가 무엇인가요? 언제 사용할까요?
쓰레드에서 스택만 별개로 가지는 이유가 무엇인가요?
함수를 실행하려면 콜 스택이 있어야 하기 때문. 스레드는 각자 다른 작업을 하기 때문에, 매개변수나 지역 변수를 가지려면 스택이 필요하다.
멀티 쓰레드 환경에서 힙 영역을 공유한다면 생길 수 있는 문제점이 있나요? 있다면 어떻게 해결해야하나요?
동시성 문제 발생
이 문제를 해결하기 위해서 어떻게 하면 될까요?
synchronized, concurrent 자료구조
사용하시는 프레임워크에서는 멀티 쓰레드 환경에서 쓰레드가 부족하면 어떻게 되나요?
스레드풀에 대기 큐 쌓이게 됩니다 → 메모리 부족 성능 저하
대기 큐가 꽉 차면 어떡할까요?
최대 큐 사이즈만큼 늘리는 것이 가능 그 이후에 들어오는 요청은 Exception 발생시키거나 Abort 하는 등의 전략을 설정할 수 있음
자바에서 스레드를 아예 안쓰면 api 서버는 어떻게 될까요? (최대 스레드 수 = 최소 스레드 수 = 1)
쓰레드를 너무 많이 생성하면 어떤 일이 발생할까요?
컨텍스트 스위칭 오버헤드
OOM 발생 가능
멀티 프로세싱과 멀티 프로그래밍의 차이는?
멀티 프로세싱은 여러 개의 프로세서가 독립적으로 다수의 프로세스를 동시에 처리하는 것이고, 멀티프로그래밍은 단일 프로세서가 여러 프로세스를 번갈아가며 처리하는 것입니다.
프로세스 혹은 스레드의 동기화란 무엇인가요?
여러 프로세스 또는 스레드 간에 실행 순서나 자원 접근 등을 조절하여 같은 자원에 접근할 때 발생하는 문제를 방지하는 기법.
사용하는 환경에서 프로세스/스레드 간 동기화를 어떻게 하나요?
synchronized, concurrent
도커 컨테이너들은 도커엔진을 공유하는데 그렇다면 도커엔진에 문제가 생긴다면 컨테이너들은 모두 종료되나요?
도커 엔진에 OS에서 자원을 받음 도커 엔진에 문제가 생기면 모든 컨테이너가 종료될 가능성 있음
그렇다면 어떻게 해결해야하나요?
미리 스케일아웃해서 고가용성을 유지한다 / 자원 할당을 사전에 적절히 한다.
쿠버네티스는 왜 사용할까요?
여러 가지 컨테이너를 orchestraion 하기 위해서
도커를 사용하는 이유는 무엇이고 사용해봤다면 그 장점을 설명해주세요.
서버 배포 편의성, 일관된 환경에서 실행 가능
도커를 사용하지 않고 배포를 해보셨나요?
nginx, git pull, proxy, … ⇒ shell script / 직접
도커 동작 원리에 대해서 설명해주세요.
도커 엔진은 자원을 어떤 기준으로 할당받는가?
도커에 스프링 서버를 띄우면, 스레드 스케줄링은 어떻게 할까? JVM → 도커 엔진 으로부터 할당 받아서?
도커 컨테이너는 프로세스일까요?
host OS 가 도커 엔진을 하나의 프로세스로 인식 도커 엔진안에 있는 컨테이너는 도커 엔진 안에 있는 OS의 프로세스
도커와 VM의 차이점에 대해 설명해 주세요
가상화가 등장하기 전에는 서버 하나에 하나의 어플리케이션만 구동시켰습니다. 자원을 효율적으로 이용하기 위해 하이퍼바이저 기반의 가상화 기술들이 등장했고 논리적으로 분할된 공간에서 VM이라는 독립된 가상 환경을 만들고 호스트 시스템에서 VM에 설치된 Guest OS를 구동, 모니터링 하였습니다.
도커와 VM의 차이점은 Guest OS의 유무입니다. 도커는 Guest OS를 설치하지 않으므로 자원을 더욱 효율적으로 사용할 수 있습니다. VM이 하나씩 증가할 때마다 OS를 위한 자원을 할당해 주는 반면 도커는 어플리케이션을 구동하기 위한 패키지만 있으면 컨테이너를 구동할 수 있습니다.
Docker: 가볍고 성능 좋은 것, 커널에 취약점이 있으면 도커에도 그대로 전파 VM: 격리수준이 높아서 보안적인 측면
만약 API 서버에서 스레드 풀에 있는 모든 스레드가 사용 중이고, 새로운 api 요청에 대해서 응답이 제대로 오지 않는 상황이라고 가정해보자. 이 상황에서 어떻게 이 문제에 접근하실 건가요?
api 서버에 접근해서 thread dump를 떠서 확인한다. 만약 대부분의 스레드 상태가 block/waiting 이라면 데드락이 발생했을 수 있다. 스레드 덤프를 통해서 어떤 부분이 문제인지 병목이 어디서 발생하는지 확인한다.
힙 메모리 공간을 어느정도로 잡아야 하나?
메모리 힙 영역을 너무 크게 잡으면 어떻게 되나?