신입 개발자가 작성한 연구일지입니다. 이때 오해하고 있던 잘못된 정보가 포함되어 있습니다.
목표
30000명이 동시에 접속할 수 있는 TCP 서버 만들기
30000명의 클라이언트는 전송 - 수신 - 전송 - 수신 을 반복한다.
30000명의 클라이언트를 켜 놓고, 다음날 서버가 에러 없이 살아 있는 것을 목표한다.
목표를 성취한 후에는 평균 응답 시간을 줄여보도록 하겠다.
프로젝트 Git Hub Repository 링크
https://github.com/MatorMirne/SocketCommunicate-TCP
이전 포스트
- 1일차 : 2023.06.26 - [일지/C#] - [프로젝트 예수 - 1일차] 대규모 동시접속 TCP 서버
- 2일차 : 2023.06.27 - [일지/C#] - [프로젝트 예수 - 2일차] 대규모 동시접속 TCP 서버 제작기
프로젝트명 변경 : 예수 > 김필여
친구에게 프로젝트 예수에 대해 설명하는데 웃긴 농담을 들었습니다.
무슨 예수가 3만명밖에 포용 안하냐고, 그 정도면 안양 시민도 다 못 수용하겠다는 농담을 하더군요. (저는 안양 시민입니다 ㅋㅋ)
예수까지는 어렵지 않겠느냐고, 바로 앞에 있는 피켓을 가리키더니 안양시 국회의원(?) 정도 스케일이라는 농담을 하더군요.
저도 적합하다 생각이 들어 (제 정치성향과는 전혀 상관없이 그냥 눈앞의 피켓에 보이던) 안양시 동안구 당협위원장?(이게뭐지) 김필여 님으로 프로젝트명을 바꾸겠습니다.
외국에 보면 위인이나 존경하는 사람 이름을 따서 어디에 붙이고 자식한테 붙이고 하지 않습니까!
클라이언트 풀
클라이언트가 서버에 연결되면, 서버에서는 하나의 클라이언트당 최소 4가지 정보를 저장하여 가지고 있어야 합니다.
- 클라이언트에게 바인딩된 소켓
- 클라이언트를 식별할 고유 IP
- 수신 버퍼
- 송신 버퍼
이 정보를 클라이언트가 연결되고 해제할 때마다 new() 키워드로 새로 할당받고 가비지 컬렉팅을 하다 보면, 엄청나게 많은 메모리 누수가 있을 것입니다. 따라서 스레드 풀링과 같은 방식으로 클라이언트 오브젝트 풀링을 구현해보도록 하겠습니다.
클라이언트 객체 - Remote
먼저, 풀링할 오브젝트를 기획해 보겠습니다. 클래스 이름은 원격 객체라는 의미로 Remote라고 하겠습니다. Remote 클래스는 위에 적은 네 가지 정보를 맴버 변수로 가집니다. 기존 Client 클래스의 이름을 Remote로 변경해 주고, 오브젝트 풀링을 위한 초기화 함수를 추가해 주었습니다.
오브젝트 풀링
오브젝트 풀링에 대해서는, 이미 구현을 해 두신 분들이 많을 것 같아서 오픈소스 코드를 사용해 보도록 했습니다. 제가 사용한 라이브러리는 링크를 첨부하도록 하겠습니다. C# 오브젝트풀 구현 깃허브 오픈소스 링크(클릭)
사용 조건은 아래와 같습니다.
- 풀링할 클래스에 IPoolable을 상속받아야 할 것
- 풀링할 클래스의 생성자는 매개 변수를 받지 않는 Public Type 이어야 할 것
- 풀링할 클래스의 생성자는 public 으로 선언되어야 하며, 매개변수를 받지 않을 것
선언 방법은 아래와 같습니다.
- 위의 조건대로 클래스를 생성
- Pool<풀링할클래스> 타입의 풀 객체 pool 생성
- NodeList<풀링할클래스> 타입의 리스트 객체 list 생성
사용 방법은 아래와 같습니다.
- 오브젝트 신규 발급 시
- 풀링할클래스 변수명 = pool.Allocate(); // 풀에 여유 오브젝트가 있으면 받아 오고, 없다면 새로 발행하여 풀에 추가한다.
- list.Add(변수명); // 사용을 시작한 오브젝트를 사용중 오브젝트 리스트에 추가한다.
- 오브젝트 사용 완료 시
- list.Remove(반환할 오브젝트) // 오브젝트를 사용 중 리스트에서 삭제한다.
- Pool.Free(반환할 오브젝트) // 오브젝트를 초기화하고, 풀으로 반납한다.
오픈소스 코드를 처음 사용해 보는데, 적용하느라 애를 많이 먹었습니다 ㅎㅎ 그래도 직접 개발한 것보다 안정적이겠죠? 시간 단축도 했을거고요! 오늘 안에 오브젝트 풀링을 적용해서 정말 만족스럽습니다!
현재 시점의 코드 : 보기 링크(클릭)
현재 발생하는 에러
현재는 주 스레드가 exit 입력을 받으면 종료되기 때문에, 다른 스레드들은 이에 대책 없이 당해야 합니다. 가장 크게 반발하는 것은 클라이언트 대기 스레드 입니다. 클라이언트 대기 스레드에서 클라이언트의 연결을 위해 열려 있던 소켓이 나는 어쩌냐며 반발합니다. 보다 안정적으로 시스템을 종료하기 위해, 이 부분을 내일 다듬어 보도록 하겠습니다!
다음 글 : 2023.06.29 - [일지/미니프로젝트] - [프로젝트 김필여 - 4일차] 대규모 동시접속 TCP C# 서버 제작기
[프로젝트 김필여 - 4일차] 대규모 동시접속 TCP C# 서버 제작기
목표 30000명이 동시에 접속할 수 있는 TCP 서버 만들기 30000명의 클라이언트는 전송 - 수신 - 전송 - 수신 을 반복한다. 30000명의 클라이언트를 켜 놓고, 다음날 서버가 에러 없이 살아 있는 것을 목
develop-jen.tistory.com
'Side Project > 안양시장 프로젝트 - TCP 서버개발' 카테고리의 다른 글
[프로젝트 김필여 - 6일차] 대규모 동시접속 TCP C# 서버 제작기 (0) | 2023.07.24 |
---|---|
[프로젝트 김필여 - 5일차] 대규모 동시접속 TCP C# 서버 제작기 (0) | 2023.07.05 |
[프로젝트 김필여 - 4일차] 대규모 동시접속 TCP C# 서버 제작기 (0) | 2023.06.29 |
[프로젝트 예수 - 2일차] 대규모 동시접속 TCP C# 서버 제작기 (0) | 2023.06.27 |
[프로젝트 예수 - 1일차] 대규모 동시접속 TCP C# 서버 (0) | 2023.06.26 |