🚀
Growth log
  • About me
  • I LEARNED
    • General
      • 개발자 꿀팁
      • 그로스해킹 기초
      • 개발자에게 도메인 지식은 얼마나 중요할까?
      • DTO 논쟁에 대하여
      • MSA란?
    • Seminar
      • 테스트 커버리지 100% - SLASH 21
      • TDD가 실패하는 이유 - by 이규원님
      • 대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록
      • 결제 시스템의 SDK와 API 디자인 - SLASH 21
    • Web
      • SOP와 CORS
    • Spring & OOP
      • DTO vs VO
    • Ruby On Rails
      • Rails lib 디렉토리에 대하여
      • Rails의 concerns란?
      • Rails에서의 GC 작동원리
      • Eager loading vs Lazy loading
      • Rails 환경 구성
      • ActionCable
      • 📔Perfect ruby on rails
        • MVC 패턴인 Rails
        • Ruby on Rails 기본 - 컨트롤러
        • Ruby on Rails 기본 - 뷰
        • Ruby on Rails 기본 - 모델
        • 스캐폴딩 기능을 사용한 Rails 개발 기초
        • 뷰 개발
        • 모델 개발
        • 모델 개발 - 낙관적 동시 실행 제어
        • 모델 개발 - 유효성 검사 구현
        • 모델 개발 - Association
        • 모델 개발 - 콜백
        • 모델 개발 - 마이그레이션
        • 모델 개발 - 데이터 초기화
        • 컨트롤러 개발 - 요청 정보 추출
        • 컨트롤러 개발 - 응답
        • 컨트롤러 개발 - 상태 관리
        • 라우팅 - RESTful
        • 라우팅 - RESTful 인터페이스의 사용자 정의화
        • 라우팅 - RESTful 하지 않은 라우트 정의
        • 테스트
        • 테스트 - 준비
        • 테스트 - Unit 테스트
        • 테스트 - Functional 테스트
        • 테스트 - Integration 테스트
        • 클라이언트 개발 - Sprockets vs Webpacker
        • 클라이언트 개발 - Sprockets
    • Node.js & Express
      • 기본 개념
      • npx
    • Programing Language
      • Java
        • JavaDoc에 대해
        • invocation에 대해서
        • 어노테이션
        • 추상클래스 & 인터페이스
        • Package
        • 오버로딩 vs 오버라이딩
      • Javascript
        • TCP School 훑어보기
          • 타입
          • 형 변환
          • 변수
          • 연산자
          • 반복문
          • 배열(array)
          • 함수
          • 함수 - 스코프와 호이스팅
          • 함수 - 매개변수와 인수
          • 함수 - 미리 정의된 전역 함수
          • 객체
          • 프로토타입
          • DOM
          • BOM - Window 객체
          • 이벤트(event)
      • Ruby
        • 📔퍼펙트 루비
    • DB
      • Redis
        • Redis 개요
      • Index(인덱스)?
      • DB Transaction & Lock
      • 동시성 제어에 관하여
      • Lock(잠금)이란?
      • ActiveRecord lock vs with_lock
      • Table lock vs Row lock
      • WHERE 1=1 구문에 대하여
      • COUNT(*) vs COUNT(indexed column)
      • 📕관계형 데이터베이스 실전입문
      • 📔SQL 첫걸음
      • 📔모두의 SQL
    • Design Patterns
      • Observer pattern
      • Flyweight pattern
      • Singleton pattern
    • OOP
      • 📔오브젝트
        • 6장 메시지와 인터페이스
      • 클래스간 관계 간단 정리
    • Regex
    • Collaboration
      • Git
      • Sourcetree
  • DAILY REVIEW
    • 2021
      • August
        • 2021-08-25(Wed)
        • 2021-08-23(Mon)
        • 2021-08-11(Wed)
        • 2021-08-04(Wed)
        • 2021-08-03(Tue)
        • 2021-08-02(Mon)
      • July
        • 2021-07-29(Thu)
        • 2021-07-26(Mon)
        • 2021-07-23(Fri)
        • 2021-07-22(Thu)
        • 2021-07-21(Wed)
        • 2021-07-20(Tue)
        • 2021-07-19(Mon)
        • 2021-07-15(Thu)
        • 2021-07-14(Wed)
        • 2021-07-13(Tue)
        • 2021-07-12(Mon)
      • June
        • 2021-06-05(Sat)
        • 2021-06-04(Fri)
        • 2021-06-03(Thu)
        • 2021-06-02(Wed)
        • 2021-06-01(Tue)
      • May
        • 2021-05-31(Mon)
        • 2021-05-29(Sat)
        • 2021-05-28(Fri)
        • 2021-05-27(Thu)
        • 2021-05-26(Wed)
        • 2021-05-25(Tue)
        • 2021-05-24(Mon)
        • 2021-05-22(Sat)
        • 2021-05-21(Fri)
        • 2021-05-20(Thu)
        • 2021-05-19(Wed)
        • 2021-05-18(Tue)
        • 2021-05-17(Mon)
        • 2021-05-15(Sat)
        • 2021-05-13(Thu)
        • 2021-05-12(Wed)
        • 2021-05-11(Tue)
        • 2021-05-10(Mon)
        • 2021-05-03(Mon)
      • April
        • 2021-04-30(Fri)
        • 2021-04-29(Thu)
        • 2021-04-28(Wed)
        • 2021-04-27(Tue)
        • 2021-04-26(Mon)
        • 2021-04-24(Sat)
        • 2021-04-23(Fri)
        • 2021-04-21(Wed)
        • 2021-04-20(Tue)
        • 2021-04-19(Mon)
        • 2021-04-18(Sun)
        • 2021-04-16(Fri)
        • 2021-04-15(Thu)
        • 2021-04-14(Wed)
        • 2021-04-12(Mon)
        • 2021-04-11(Sun)
        • 2021-04-09(Fri)
        • 2021-04-08(Thu)
        • 2021-04-06(Tue)
        • 2021-04-05(Mon)
        • 2021-04-04(Sun)
        • 2021-04-03(Sat)
        • 2021-04-02(Fri)
        • 2021-04-01(Thu)
      • March
        • 2021-03-29(Mon)
        • 2021-03-28(Sun)
        • 2021-03-26(Fri)
        • 2021-03-25(Thu)
        • 2021-03-24(Wed)
        • 2021-03-23(Tue)
        • 2021-03-22(Mon)
        • 2021-03-21(Sun)
        • 2021-03-20(Sat)
        • 2021-03-17(Wed)
        • 2021-03-16(Tue)
        • 2021-03-15(Mon)
        • 2021-03-12(Fri)
        • 2021-03-11(Thu)
        • 2021-03-10(Wed)
        • 2021-03-09(Tue)
        • 2021-03-08(Mon)
        • 2021-03-07(Sun)
        • 2021-03-05(Fri)
        • 2021-03-03(Wed)
        • 2021-03-02(Tue)
        • 2021-03-01(Mon)
      • Feb
        • 2021-02-26(Fri)
        • 2021-02-25(Thu)
        • 2021-02-24(Wed)
        • 2021-02-23(Tue)
        • 2021-02-22(Mon)
        • 2021-02-19(Fri)
        • 2021-02-18(Thu)
        • 2021-02-17(Wed)
        • 2021-02-16(Tue)
        • 2021-02-15(Mon)
        • 2021-02-14(Sun)
        • 2021-02-13(Sat)
        • 2021-02-12(Fri)
        • 2021-02-10(Wed)
        • 2021-02-09(Tue)
        • 2021-02-08(Mon)
        • 2021-02-07(Sun)
        • 2021-02-05(Fri)
        • 2021-02-03(Wed)
        • 2021-02-02(Tue)
        • 2021-02-01(Mon)
      • Jan
        • 2021-01-29(Fri)
        • 2021-01-28(Thu)
        • 2021-01-27(Wed)
        • 2021-01-26(Tue)
        • 2021-01-25(Mon)
        • 2021-01-23(Sat)
        • 2021-01-22(Fri)
        • 2021-01-20(Wed)
        • 2021-01-19(Tue)
        • 2021-01-18(Mon)
        • 2021-01-12(Tue)
        • 2020-01-11(Mon)
        • 2021-01-08(Fri)
        • 2021-01-07(Thu)
        • 2021-01-06(Wed)
        • 2021-01-05(Tue)
        • 2021-01-04(Mon)
        • 2021-01-01(Fri)
    • 2020
      • Dec
        • 2020-12-30(Thu)
        • 2020-12-25(Fri)
        • 2020-12-24(Thu)
        • 2020-12-23(Wed)
        • 2020-12-22(Tue)
        • 2020-12-21(Mon)
        • 2020-12-18 (Fri)
      • Nov
        • 2020-11-30(Mon)
        • 2020-11-28(Sat)
        • 2020-11-26(Thu)
        • 2020-11-25(Wed)
        • 2020-11-24(Tue)
        • 2020-11-23(Mon)
        • 2020-11-22(Sun)
        • 2020-11-20(Fri)
        • 2020-11-19(Thu)
        • 2020-11-18(Wed)
        • 2020-11-17(Tue)
        • 2020-11-14(Sat)
        • 2020-11-13(Fri)
        • 2020-11-12(Thu)
        • 2020-11-11(Wed)
        • 2020-11-09(Mon)
        • 2020-11-07(Sat)
        • 2020-11-05(Thu)
        • 2020-11-04(Wed)
        • 2020-11-03(Tue)
        • 2020-11-02(Mon)
    • Good article 아카이빙
Powered by GitBook
On this page
  • Q) 애플리케이션 관점에서는 어떤 준비를 하시는지?
  • Q) 전송하는 파일의 유형에 따라서 최적화된 서버 파라미터라는 건 너무 많다. 관리할게 많을 텐데 이런걸 다 한 명이 관리하는 건가?
  • Q) 모니터링하다가 문제가 생기면 어떻게 대응하는지?
  • Q) 많은 트래픽을 효율적으로 처리하는 방법은?
  • Q) 라인에서는 비동기 처리를 어떤 로직이나 기술로 하시는지?
  • Q) 라인의 장애대응방은 어디에 쓰고 계세요?
  • Q) CDN 활용에 대해서 더 자세히 알고 싶다. REST API 응답 처리도 CDN으로 상당 부분 처리 가능할 것 같은데, 신년대응 시점에는 TTL 등을 어떻게 처리하는가?
  • Q) 신년 대응을 내년에 또 한다면 올해와 뭐가 달라질 것 같은가?

Was this helpful?

  1. I LEARNED
  2. Seminar

대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록

라인개발실록 영상을 보고 문답을 정리했습니다. 실무가 느껴지는 영상!

Q) 애플리케이션 관점에서는 어떤 준비를 하시는지?

두 가지로 나눌 수 있다.

  1. 미리 준비할 수 있는 것

  2. 문제가 생겼을 때 대응할 수 있는 것들.

1번 예시. keep-alive를 이용해서 connection을 맺어놓고 계속 쓰는 방법을 쓴다. 프록시랑 애플리케이션 트래픽을 처리할 WAS단의 서버가 있을 수 있는데, 프록시에서 WAS단에 전달할 수 있는 Max Connection을 미리 제한해 둔다. 마찬가지로 Proxy에서 뒷단으로 전달되는 connection 수도 제한을 걸어둔다.

keep-alive를 적용할 때도 timeout, maxRequests를 설정할 수 있다. 라인 메시징 서버 같은 경우에는 짧은 시간에 트래픽이 확 오르기 때문에 maxRequests 기준으로는 여유있게 늘려주거나 아예 제한을 없애버려서 keep-alive connection이 충분히 유지될 수 있도록 설정을 해둘 수 있다.

keep-alive를 키게 되면 connection들이 연결된 채로 많이 물려 있을 수 있기 때문에 tomcat의 max connections 설정도 미리 문제가 없도록 프록시 서버들의 수준을 계산해서 늘려 놓는다.

Q) 전송하는 파일의 유형에 따라서 최적화된 서버 파라미터라는 건 너무 많다. 관리할게 많을 텐데 이런걸 다 한 명이 관리하는 건가?

아니다. 각 서비스의 특징에 맞게 튜닝한다.

Q) 모니터링하다가 문제가 생기면 어떻게 대응하는지?

모니터링 수치들, 주요 매트릭들을 보고 있다가 문제가 생겼을 경우엔 어떻게 대처할지 방법을 논의하게 된다.

일반적으로 두 가지 방법이 있을 것이다.

  1. 문제가 생겼을 때 서버로 들어오는 리퀘스트 자체를 줄이는 방법

  2. 한 컴포넌트에 문제가 생겼을 때 다른 컴포넌트에 요청을 보내지 않도록 하는 대응

서비스 관점에서 Throttling을 건다면 어떻게 동작을 하는가? 만약 VoIP 쪽 서버에 문제가 생겨서 10%만 수용할 수 있게 되었다면? 서버를 다 꺼버리는 것이 아니라, 10%라도 서버를 이용할 수 있게 하고, 나머지에게는 다시 시도해달라는 메세지를 보내게 된다.

Q) 많은 트래픽을 효율적으로 처리하는 방법은?

이 질문에 대한 답은 서비스마다 달라질 수 있을 것이다.

만약 메신저 서비스처럼 일반적인 서비스의 경우에는 활동시간대가 다를 수 있다. 또 어떤 서비스의 경우 이미지를 많이 쓰거나 영상을 많이 쓰는 등 상황에 따라 트래픽이 달라진다.

일반적으로 stateless한 서버 같은 경우 앞단에 정적(static) 콘텐츠를 서빙하기 위한 서버를 따로 빼고 CDN을 적용해 놓고 Application layer에는 Storage쪽으로 가기 전에 캐시 등을 구성하는 일반적이고 보편적인 구성들이 있을 수 있는데, 나머지들은 수치 같은 것을 좀 더 조정할 수 있을 것 같다. 어떤 병목의 쓰레드 풀(Thread pool)을 늘리는 등등!

Q) 라인에서는 비동기 처리를 어떤 로직이나 기술로 하시는지?

라인은 Armeria 오픈소스를 한번씩 봐주면 좋겠다. 퍼포먼스도 좋고 서버, 클라이언트 둘 다 기능이 있다.

Q) 라인의 장애대응방은 어디에 쓰고 계세요?

라인 메세지로 장애 대응을 할 때는 라인 웍스나 Slack을 쓰고 있다.

Q) CDN 활용에 대해서 더 자세히 알고 싶다. REST API 응답 처리도 CDN으로 상당 부분 처리 가능할 것 같은데, 신년대응 시점에는 TTL 등을 어떻게 처리하는가?

메신저는 바로 보내야하기 때문에 캐싱할 수 있는 부분이 거의 없긴 하다. 스티커 정도??

기본적으로 신년 대응을 위해 TTL을 따로 조정하는 경우는 없다. 보통 API 콜 같은 경우는 캐시할 수 없는건 non-store로 처리되고 있다.

Q) 신년 대응을 내년에 또 한다면 올해와 뭐가 달라질 것 같은가?

코로나 상황이 계속될지 여부에 따라 달라질 것 같다.

PreviousTDD가 실패하는 이유 - by 이규원님Next결제 시스템의 SDK와 API 디자인 - SLASH 21

Last updated 4 years ago

Was this helpful?

출처:

대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록