개념 모아두기

SeonKyum·2021년 12월 22일
0

백엔드 개념

목록 보기
12/23

리버스 프록시

서버와 클라이언트 사이에 중계기로써 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.

리버스 프록시는 클라이언트의 요청을 먼저 받아 서버에게 요청을 전달해주고 다시 데이터를 받아 클라이언트에 전달해 줍니다.

클라이언트는 리버스 프록시 서버를 먼저 호출하게 되기 때문에 실제 서버의 IP를 알 수 없습니다.

무중단 배포는 어떻게 작업했고, 우리 서비스에 필요한 이유는?

무중단 배포는 Nginx와 젠킨스를 사용하여 구현했습니다.

  • Jenkins

    젠킨스 파이프 라인은 스크립트를 이용하여 배포를 하는 방식보다 Jenkins UI를 통하여 배포하는 방식이 짦은 프로젝트 기간에 알맞다고 생각하여 freestyle project 로 선택했습니다.

    빌드 유발방식은 서버쪽은 pr을 이용해 main브랜치에서만 빌드를 하기때문에 GITScm polling을 사용하여 진행했고 스케줄러는 feature/브랜치 에서 푸쉬로 연동을 해야하기 때문에 generic webhook을 사용했다

    jenkins 혹시라도 어려운거 있엇나 물어보면

    • jenkins의 환경설정 예를들어 빌드방식을 shell 로 할지, invoke gradle script로 할지 여러가지 설정에 대해 고민했지만 추가적으로 복잡한 세팅을 설정할 필요가 없어서 비교적 간단한 설정으로 실행할 수 있는 invoke gradle script로 진행
  • Nginx

    먼저 yaml 파일을 만들어서 8081과 8082 2가지 포트로 서버가 구동될 수 있도록 프로필을 설정해 놓았습니다.

    그리고 nginx 포트 포워딩을 설정해두었습니다.

    그리고 재시동 쉘 스크립트와 전환 쉘 스크립트를 만들어두어 젠킨스에서 빌드 파일을 서버로 전송시, 재시동 쉘 스크립트가 실행되도록하여 현재 nginx가 가리키고 있지 않은 포트로 수정된 빌드파일을 배포 한후, 전환 쉘 스크립트로 nginx과 바뀐 포트에 요청을 보내도록 하였습니다.

    그래서 서버가 중단 되지않으면서 수정된 버전을 배포할 수 있었습니다.

스케일 업과 스케일 아웃의 차이

스케일 아웃은 서버 자체를 여러대 추가시켜서 성능을 증가시키는 것입니다. 서버가 여러대가 되기 때문에 부하를 균등하게 배분해야하는 로드 밸런서가 필수입니다. 저희는 AWS ELB를 로드밸런서로 사용했습니다. \

스케일 업은 서버자체의 성능을 향상시켜주는 것을 의미 합니다.

라운드 로빈 방식이란?

로드 밸런싱의 알고리즘 중에 하나가 라운드 로빈 입니다. 서버에 요청이 들어온 순서대로 서버에 분배합니다.

여러 알고리즘 중 라운드 로빈 방식을 선택한 이유는 서버의 상태 때문입니다.

저희 서버는 프리티어 서버로 모두 동일한 램을 가지고 있습니다. 그렇기에 가중치 없이 균등 배분하는 것이 낫다고 판단했으며

서비스 특성상 짧게 모임을 검색하고 나가기 때문에 세션이 짧습니다. 그래서 라운드 로빈 방식을 적용했습니다.

http 와 https 의 차이점

HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이였기 때문에 보안에 취약함

https 는 http에 데이터 암호화가 추가된 프로토콜

저희는 aws에서 SSL 인증방식을 통해 htpps 를 설정하였습니다.

fixedDelay 단위

ms 으로써 (ex. 5000 = 5초) fixedRate와의 차이점은

fixed Delay은 이전에 실행된 task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task 실행,

fixed Rate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난후 Task를 실행한다

fixedDelay를 선택한 이유는 스레드 풀이 겹치지 않게 하기 위함이다 (스레드풀 자동생성됨)

스레드 풀을 사용해야하는 이유

  1. 프로그램 성능저하를 방지하기 위해

    매번 발생되는 작업을 병렬처리하기 위해 스레드를 생성/수거 하는데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킴으로 따라서 스레드풀을 만들어놓는다.(내가 이해한건 직병렬 혼용)

  2. 다수의 사용자 요청을 처리하기 위해

    서비스적인 측면으로 바라볼 때

    특히 대규모 프로젝트에서 중요하다. 다수의 사용자의 요청을 수용하고 빠르게 처리하고 대응하기 위해 스레드풀을 사용.

    스레드 풀이란?

    스레드 풀은 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다.

    그렇게하면 작업처리 요청이 폭증되어도 스레드의 전체개수가 늘어나지 않으므로 (하나씩 처리) 시스템 성능이 급격히 저하되지 않는다.

    자바는 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent.Executors 클래스와 java.util.concurrent.ExecutorService인터페이스를 제공하고 있다.

    스레드는 컴퓨터 내부적으로 운영체제(os)가 요청을 받아들여 메모리공간을 확보해주고 그 메모리를 스레드에게 할당해준다. 스레드는 동일한 메모리 영역에서 생성되고 관리되지만, 생성/수거에 드는 비용을 무시할 수 없다

    가뜩이나 프리티어에 스왑메모리를 사용하는 상태에서 많은 스레드 풀이 생긴다면 그만큼 메모리의 낭비가 심하다고 판단하여 fixedDelay를 사용

부하테스트

부하 테스트 툴로는 ngrinder 를 사용하였습니다 .처음에는 jmeter를 사용하여 부하테스트를 했습니다 하지만 중간점검때 jmeter 보다는 ngrinder 가 사용성이 편하고 자료들도 많이 있어

ngrinder로 하라는 피드백을 받은 후 ngrinder 로 진행하게 되었습니다.

REST는 무엇이고, REST와 CRUD를 연관지어 설명

REST 란 ?

"Representational Status Transfer" 의 약자이다. 월드 와이드 웹(www) 과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.

REST란 , "웹에 존재하는 모든 자원(이미지, 동영상, DB자원)' 에 고유한 URI를 부여해 활용" 하는것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미

이런 REST의 형식을 따른 시스템을 RESTful 이라고 부른다.

HTTP URI 를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원의 대한 CRUD Operation을 적용한다.

CRUD Operation , HTTP Method

  1. Create : POST (자원 생성)

  2. Read : GET (자원의 정보 조회)

  3. Update : PUT (자원의 정보 업데이트)

  4. Delete : DELETE (자원 삭제)

    REST 구성요소

  5. 자원(Resource) , URI모든 자원은 고유한 ID를 가지고 ID는 서버에 존재하고 클라이언트는 각 자원의 상태를 조작하기 위해 요청을 보낸다. HTTP에서 이러한 자원을 구별하는 ID는 ‘Students/1’ 같은 HTTP URI 이다.

    1. 행위(Verb) , Method클라이언트는 URI를 이용해 자원을 지정하고 자원을 조작하기 위해 Method를 사용한다. HTTP 프로토콜에서는 GET , POST , PUT , DELETE 같은 Method를 제공한다.
    2. 표현(Representation)클라이언트가 서버로 요청을 보냈을 때 서버가 응답으로 보내주는 자원의 상태를 Representation이라고 한다. REST에서 하나의 자원은 JSON , XML , TEXT , RSS 등 여러형태의 Representation으로 나타낼수 있다

    REST 의 특징

  6. 클라이언트 / 서버 구조 (Client-Server)자원이 있는 Server , 자원을 요청하는 Client의 구조를 가진다.

    1. 무상태 (Stateless)HTTP는 Stateless 프로토콜 이므로 REST 역시 무상태성을 가진다. 클라이언트의 Context 를 서버에 저장하지 않는다.
    2. 캐시 처리 가능 (Cachealble)웹 표준 HTTP 프로토콜을 그대로 사용하므로 , 웹에서 사용하는 기존의 인프라를 그대로 활용 가능하다.
    3. 계층화API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 사용자 인증 , 암호화 , 로드밸런싱 등을 하는 계층을 추가하여 구조상의 유연성을 줄 수 있다.
    4. 인터페이스 일관성(Uniform Interface)URI로 지정한 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다. HTTP 표준에만 따른다면 모든 플랫폼에 사용이 가능하다.
    5. 자체 표현 구조동사(Method) + 명사(URI) 로 이루어져있어 어떤 메서드에 무슨 행위를 하는지 알 수 있으며 REST API 자체가 매우 쉬워서 API 메세지 자체만 보고도 API를 이해할 수 있다

    REST의 장단점

    장점

    1. 쉬운 사용HTTP 프로토콜 인프라를 그대로 사용하므로 별도의 인프라를 구축할 필요가 없다.
    2. 클라이언트-서버 역할의 명확한 분리클라이언트는 REST API를 통해 서버와 정보를 주고받는다. REST의 특징인 Stateless에 따라 서버는 클라이언트의 Context를 유지할 필요가 없다.
    3. 특정 데이터 표현을 사용가능REST API는 헤더 부분에 URI 처리 메소드를 명시하고 필요한 실제 데이터를 ‘body’에 표현할 수 있도록 분리시켰다. JSON , XML 등 원하는 Representation 언어로 사용 가능하다.

    단점

    1. 메소드의 한계REST는 HTTP 메소드를 이용하여 URI를 표현한다. 이러한 표현은 쉬운 사용이 가능하다는 장점이 있지만 반대로 메소드 형태가 제한적인 단점이 있다.
    2. 표준이 없음REST는 설계 가이드 일 뿐이지 표준이 아니다. 명확한 표준이 없다.
profile
차근차근,,

0개의 댓글