작성
·
390
·
수정됨
0
안녕하세요!
싱글톤패턴으로 하나의 인스턴스를 생성하는데, 만약 요청이 많아지는 경우 어떤 현상이 발생하는지 궁금합니다.
예를 들어, DB를 연결하는 부분이 싱글톤패턴으로 되어있고 동시에 1000개의 요청이 들어오게 되는 경우에는 어떤 현상이 발생하나요?
연결하는 자원이 하나이므로, 자원 경쟁 상태가 되면서 지연되는 걸까요? 만약 그렇다면, 이 현상은 어떻게 해결할 수 있을지 궁금합니다.
답변 1
1
안녕하세요 ㅎㅎ
예를 들어, DB를 연결하는 부분이 싱글톤패턴으로 되어있고 동시에 1000개의 요청이 들어오게 되는 경우에는 어떤 현상이 발생하나요?
연결하는 자원이 하나이므로, 자원 경쟁 상태가 되면서 지연되는 걸까요? 만약 그렇다면, 이 현상은 어떻게 해결할 수 있을지 궁금합니다.
>>
DB마다 다릅니다만... 만약 아주 단순한 DB라면 해당 인스턴스를 기반으로 쿼리가 많이 발생된다면 지연될 것입니다.
다만, 보통의 DB의 경우 커넥션 풀을 기반으로 지연되지 않습니다.
MongoDB와 MySQL을 기반으로 설명드리겠습니다.
먼저 싱글턴패턴은 초기 연결하는 인스턴스를 설정할 때 해당 인스턴스를 하나만 둘 때 사용됩니다.
그리고 그 인스턴스를 기반으로 내부적으로 커넥션풀을 기반으로 많은 요청들을 처리할 수 있습니다.
MongoDB의 경우 url 에다가 maxPoolsize를 설정해서 해당 풀의 사이즈를 설정한 후
mongodb://myDatabaseUser:D1fficultP%40ssw0rd@db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&ssl=true&maxPoolSize=50
url을 기반으로 인스턴스를 만들면
해당 풀 사이즈를 가진 인스턴스가 하나 생성되게 됩니다.
기본값은 100입니다.
MySQL의 경우
const pool = mysql.createPool({
connectionLimit: 10,
host: 'example.org',
user: 'kundol',
password: 'secret',
database: '승철이디비'
});
앞의 코드와 같이 pool이란 인스턴스 하나만을 생성합니다.
커넥션 풀은 쿼리에 필요한 커넥션들을 담은 공간을 의미합니다.
미리 커넥션들을 많이 만들어 놓고 그걸 기반으로 커넥션을 줘서 해당 요청을 처리하는 것이죠. 요청마다 커넥션을 만들면 너무나도 자원소모량이 크기 때문에 요청할 때 커넥션 주고 요청 끝나면 커넥션을 다시 풀에 담아놔서 자원의 효율성을 증대시키는 매커니즘입니다.
그림으로 그리면 다음과 같이 됩니다.
이렇게 초기 연결하는 인스턴스는 단하나만 두고 이 인스턴스를 기반으로 내부적으로 커넥션풀을 사용해서 많은 다중 요청들을 처리합니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
혹시 싱글톤패턴으로 된 컴포넌트가 경쟁상태가 됐을 때 해결방안이 무엇이 있을지도 여쭤봐도 될까요? (이 질문이 적합한 질문일지 모르겠지만...)
>> 싱글톤패턴을 정의할 때 경쟁상태를 해결하는 방법 같은 경우 JAVA 코드 기준으로 이 CS 강의 내의 싱글톤패턴 : DEEP DIVE를 통해서 설명드리고 있습니다.
이미지 로딩 컴포넌트가 파일 시스템으로부터 이미지를 가져오는 구조라고 했을 때는 다중 요청 발생 시 지연이 된다
>> 이미지로딩을 싱글톤패턴으로 구현한다는 것은 아마 다음과 같이 될 것 같습니다.
1.초기에 이미지관련 인스턴스 초기화
2.해당 인스턴스를 다중요청을 하여 읽음.
이 경우에 만드는 방법에 따라 다르겠지만 잘 만들면 경쟁상태는 일어나지 않습니다.
아주 대표적인 예로 java의 enum으로 만들게 되면 스레드세이프해서 경쟁상태는 발생하지 않습니다.
비동기 라이브러리와 쓰레드 풀로 해결한다는 글을 봤는데 머릿속으로 그 구조가 잘 그려지지 않습니다.
>> 스레드풀로 경쟁상태를 해결하는 것은 처음 들어보는데요. 스레드풀은 여러개의 스레드를 미리 생성해서 스레드 생성, 소멸에 드는 비용을 줄이기 위한 기술입니다.
제 생각에는 다중 네트워크 요청을 처리하는 방법 같은데요. MQ, 스레드풀, 이벤트루프 등을 말하는게 아닐까요?
감사합니다.
상세한 답변 감사합니다! 😊 덕분에 DB경우에는 잘 이해했습니다..!
혹시 싱글톤패턴으로 된 컴포넌트가 경쟁상태가 됐을 때 해결방안이 무엇이 있을지도 여쭤봐도 될까요? (이 질문이 적합한 질문일지 모르겠지만...)
예를 들어, 싱글톤패턴으로 되어있는 이미지 로딩 컴포넌트가 파일 시스템으로부터 이미지를 가져오는 구조라고 했을 때는 다중 요청 발생 시 지연이 된다면 어떻게 처리할 수 있을까요?
비동기 라이브러리와 쓰레드 풀로 해결한다는 글을 봤는데 머릿속으로 그 구조가 잘 그려지지 않습니다.