서버와 클라이언트 사이에 중계기로써 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
리버스 프록시는 클라이언트의 요청을 먼저 받아 서버에게 요청을 전달해주고 다시 데이터를 받아 클라이언트에 전달해 줍니다.
클라이언트는 리버스 프록시 서버를 먼저 호출하게 되기 때문에 실제 서버의 IP를 알 수 없습니다.
무중단 배포는 Nginx와 젠킨스를 사용하여 구현했습니다.
Jenkins
젠킨스 파이프 라인은 스크립트를 이용하여 배포를 하는 방식보다 Jenkins UI를 통하여 배포하는 방식이 짦은 프로젝트 기간에 알맞다고 생각하여 freestyle project 로 선택했습니다.
빌드 유발방식은 서버쪽은 pr을 이용해 main브랜치에서만 빌드를 하기때문에 GITScm polling을 사용하여 진행했고 스케줄러는 feature/브랜치 에서 푸쉬로 연동을 해야하기 때문에 generic webhook을 사용했다
jenkins 혹시라도 어려운거 있엇나 물어보면
Nginx
먼저 yaml 파일을 만들어서 8081과 8082 2가지 포트로 서버가 구동될 수 있도록 프로필을 설정해 놓았습니다.
그리고 nginx 포트 포워딩을 설정해두었습니다.
그리고 재시동 쉘 스크립트와 전환 쉘 스크립트를 만들어두어 젠킨스에서 빌드 파일을 서버로 전송시, 재시동 쉘 스크립트가 실행되도록하여 현재 nginx가 가리키고 있지 않은 포트로 수정된 빌드파일을 배포 한후, 전환 쉘 스크립트로 nginx과 바뀐 포트에 요청을 보내도록 하였습니다.
그래서 서버가 중단 되지않으면서 수정된 버전을 배포할 수 있었습니다.
스케일 아웃은 서버 자체를 여러대 추가시켜서 성능을 증가시키는 것입니다. 서버가 여러대가 되기 때문에 부하를 균등하게 배분해야하는 로드 밸런서가 필수입니다. 저희는 AWS ELB를 로드밸런서로 사용했습니다. \
스케일 업은 서버자체의 성능을 향상시켜주는 것을 의미 합니다.
로드 밸런싱의 알고리즘 중에 하나가 라운드 로빈 입니다. 서버에 요청이 들어온 순서대로 서버에 분배합니다.
여러 알고리즘 중 라운드 로빈 방식을 선택한 이유는 서버의 상태 때문입니다.
저희 서버는 프리티어 서버로 모두 동일한 램을 가지고 있습니다. 그렇기에 가중치 없이 균등 배분하는 것이 낫다고 판단했으며
서비스 특성상 짧게 모임을 검색하고 나가기 때문에 세션이 짧습니다. 그래서 라운드 로빈 방식을 적용했습니다.
HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이였기 때문에 보안에 취약함
https 는 http에 데이터 암호화가 추가된 프로토콜
저희는 aws에서 SSL 인증방식을 통해 htpps 를 설정하였습니다.
ms 으로써 (ex. 5000 = 5초) fixedRate와의 차이점은
fixed Delay은 이전에 실행된 task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task 실행,
fixed Rate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난후 Task를 실행한다
fixedDelay를 선택한 이유는 스레드 풀이 겹치지 않게 하기 위함이다 (스레드풀 자동생성됨)
스레드 풀을 사용해야하는 이유
프로그램 성능저하를 방지하기 위해
매번 발생되는 작업을 병렬처리하기 위해 스레드를 생성/수거 하는데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킴으로 따라서 스레드풀을 만들어놓는다.(내가 이해한건 직병렬 혼용)
다수의 사용자 요청을 처리하기 위해
서비스적인 측면으로 바라볼 때
특히 대규모 프로젝트에서 중요하다. 다수의 사용자의 요청을 수용하고 빠르게 처리하고 대응하기 위해 스레드풀을 사용.
스레드 풀은 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다.
그렇게하면 작업처리 요청이 폭증되어도 스레드의 전체개수가 늘어나지 않으므로 (하나씩 처리) 시스템 성능이 급격히 저하되지 않는다.
자바는 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent.Executors 클래스와 java.util.concurrent.ExecutorService인터페이스를 제공하고 있다.
스레드는 컴퓨터 내부적으로 운영체제(os)가 요청을 받아들여 메모리공간을 확보해주고 그 메모리를 스레드에게 할당해준다. 스레드는 동일한 메모리 영역에서 생성되고 관리되지만, 생성/수거에 드는 비용을 무시할 수 없다
가뜩이나 프리티어에 스왑메모리를 사용하는 상태에서 많은 스레드 풀이 생긴다면 그만큼 메모리의 낭비가 심하다고 판단하여 fixedDelay를 사용
부하 테스트 툴로는 ngrinder 를 사용하였습니다 .처음에는 jmeter를 사용하여 부하테스트를 했습니다 하지만 중간점검때 jmeter 보다는 ngrinder 가 사용성이 편하고 자료들도 많이 있어
ngrinder로 하라는 피드백을 받은 후 ngrinder 로 진행하게 되었습니다.
REST 란 ?
"Representational Status Transfer" 의 약자이다. 월드 와이드 웹(www) 과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.
REST란 , "웹에 존재하는 모든 자원(이미지, 동영상, DB자원)' 에 고유한 URI를 부여해 활용" 하는것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미
이런 REST의 형식을 따른 시스템을 RESTful 이라고 부른다.
HTTP URI 를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원의 대한 CRUD Operation을 적용한다.
Create : POST (자원 생성)
Read : GET (자원의 정보 조회)
Update : PUT (자원의 정보 업데이트)
Delete : DELETE (자원 삭제)
자원(Resource) , URI모든 자원은 고유한 ID를 가지고 ID는 서버에 존재하고 클라이언트는 각 자원의 상태를 조작하기 위해 요청을 보낸다. HTTP에서 이러한 자원을 구별하는 ID는 ‘Students/1’ 같은 HTTP URI 이다.
클라이언트 / 서버 구조 (Client-Server)자원이 있는 Server , 자원을 요청하는 Client의 구조를 가진다.
장점
단점