if kakao 2019 Day1 후기

그 동안 AWS 컨퍼런스만 참석했었는데 이번에 처음으로 kakao에서 진행하는 개발자 컨퍼런스에 참여하게 되었습니다. 저는 백엔드, DevOps 관련해서 관심이 있었기에 관련 주제만을 골라서 들었습니다. 각 세션의 내용을 하나하나 정리하기엔 너무 많아서 개인적으로 인상 깊었던 부분만을 정리하였습니다.

첫 번째 세션: 서비스 장애를 극복하는 게임플랫폼 구축하기
(Build a fault tolerant system)

1.서비스 장애

  • 서비스 장애란 “정상적 기능이 불가한 경우”이다.
  • 서비스 장애 순서
    1. API 에러
    2. 응답 지연
    3. 서버 장애
    4. 전체 시스템 정지
  • 위와 같은 순서로 장애가 발생하기 시작하는데, 이 시간은 매우 짧다.
  • “서버 장애 -> 전체 시스템 정지” 로 넘어가지 않는 것이 중요하다. 일부 서버만 장애인 경우, 사용자의 입장에선 특정 기능이 되지 않아 조금은 불편할 수 있지만 전체 서비스를 사용하지 못하는 것은 아님

2.장애 허용 시스템 (FTS)

  • 일부 문제가 발생하여도 전체 서비스는 정상 동작하는 시스템
  • 사례1: 로그인 인증 처리 사례
    • 게임 플랫폼 인증 서버에서 외부 인증 서버(카카오 계정 인증 서버 or 구글 계정 인증 서버)를 통해 인증토큰을 얻어 자체 인증토큰을 만든다.
    • 외부 서버인 카카오 계정 인증 서버에 장애가 생긴 경우, 자연스럽게 게임 플랫폼 인증 서버도 장애가 발생하게 된다
    • 해결방안: 기존에 가입된 고객의 토큰 갱신인 경우에는 외부 인증 서버가 장애가 나도 유효하다고 판단하고 토큰을 갱신을 해서 넘겨주도록 한다
      • 보안에 문제가 있을 수 있지 않을까?
        => 매번 외부 인증 서버를 안 거치는 것이 아니라 외부 인증 서버가 장애인 경우에 한해서 하는 것이기 때문에 이 정도는 넘어갈 수 있는 부분이라고 판단함
      • 장애가 발생하는 시점의 로그인 요청 중 95%가 기존 고객임. 그렇기에 신규유저 5%만 장애를 겪고 나머지 95%는 정상적으로 서비스를 이용할 수 있음
  • Thread Pool 관리
    • 공용 Thread Pool을 사용할 경우
      • API 종류가 로그인, 유저 정보 조회, 목록조회, 유저 탈퇴 4가지가 있다고 가정
      • 정상적인 경우에는 Thread Pool에 4가지의 기능 스레드가 골고루 있게 됨
      • 특정 하나의 기능에 장애가 발생하게 되면, 응답 지연이 일어나게 되고 점점 Thread Pool 전체가 하나의 쓰레드로 꽉차게 됨. 이렇게 되면 전체 장애로 이어짐
    • 용도별 Thread Pool 그룹 분할
      • 하나의 공요 Thread Pool로 관리하게 되면 생기는 문제를 해결 할 수 있음
      • 1번 Thread Pool은 로그인, 유저 정보 조회관련 Thread만, 2번 Thread Pool은 목록조회 기능만, 3번 Thread Pool은 유저 탈퇴 기능만.
      • 이런식으로 분리를 하게 되면, 특정 하나의 기능이 장애가 나도 그 기능이 속한 Thread Pool만 영향을 받게 되고 다른 Thread Pool들은 기존처럼 정상적으로 사용할 수 있음
  • 비동기 서비스 로직 처리
    • 신규 가입의 경우 3번의 외부 서비스 호출이 일어 난다
      • IDP 인증서버: 인증을 담당
      • 프로필 서버: 인증 후 프로필을 생성 요청
      • 로그 서버: 관련해서 로그를 남김
    • IDP 인증서버가 장애가 있어서 응답지연이 생기는 경우, 신규가입 쓰레드 전체의 응답지연이 생기고 장애로 이어질 수 있다
    • 이렇게 비동기 적으로 일어나는 부분 각각을 하나의 쓰레드로 분리
      • IDP 인증서버 요청, 프로필 서버 요청, 로그 서버 요청 각각을 쓰레드로 분리해 각각 별도 쓰레드에서 처리하도록 변경
    • IDP 인증서버 요청 쓰레드에서 완료하고 나면 프로필 서버 요청 쓰레드를 만드는 식..
    • 장점
      1. 로그인 처리 시간 단축
      2. 처리 속도 지연으로 인한 Tread Pool 고갈 방지

3.알림설정

  • 서비스API가 잘 동작 하는지 확인 하는 것도 정말 중요하다
  • 처음에 모든 알림을 수신하도록 해서 너무 많은 알림이 왔음
  • 이렇게 되면 결국 읽지 않게 되고 스팸이 되버림
  • 알림을 줄임
    모든 알림을 수신 -> 그룹별로 정리(로그인, 푸시, 아이템, 유저조회) -> 발송 빈도 조절(5분에 한번) -> 임계치 설정(10회 이상 발생시)

“신뢰를 쌓는 것은 20년이 걸리지만 신뢰를 무너트리는 것은 5분이면 충분하다”

두번째 세션: 초당옥수수의 취소를 막아라!
: 수만 건의 주문을 1초내에 처리하는 기술

<배경>

초당 옥수수라는 상품이 있음. 달달한 옥수수인데 주문을 미리 받고 수확철이 될 때 바로 재배하여 배송하는 시스템이다. 하지만 태풍이나 기타 기상악화 때문에 수확이 늦어지는 경우 배송지연 알림을 보낸다. 고객이 주문 취소를 하지 않도록 배송 지연 알림을 빠르게 보내는 것이 중요.

<기존 문제>

  • 코드가 스파게티처럼 얽혀있음
  • 배치를 통해 1시간에 한번씩 돌도록 되어 있음
    • 배치 시간을 5분으로 줄일 수는 있지만 근본적인 해결방법은 아님

<미션: 실시간 TMS(Target Message System) 발송을 위한 워커 구성>

  • Before
    1. Rest API을 통해 배송지연 처리 요청
    2. Batch Job을 통해 DB에서 배송지연 요청을 읽어 여러개의 Thread를 통해 TMS 발송
  • After
    • Rest API를 통해 배송지연 처리 요청
    • Message Queue(RabbitMQ)에 쌓음
    • TMS 발송 처리기에서 Message Queue에서 데이터를 얻어와 발송

<병목을 비동기 워커로 분산처리>

  • 밸리데이션 > 비즈니스 처리 비동기 워커 > TMS 발송 비동기 워커
  • 3개로 각각 분리하여 사이 사이에 Message Queue를 도입
  • 각 워커에서 처리하는 job들은 Atomic(다른 것에 영향을 주거나 받지 않음)해야된다.

<배포없이 빠르게 롤백하는 전략>

  • 기존의 시스템과 새로 도입되는 시스템 앞에 switch라는 개념을 둬서 새로운 시스템을 쓸지 말지를 on/off 할수 있도록 어플리케이션 레벨에서 처리함
  • on/off할지에 대한 값은 zookeeper를 통해 값을 읽도록 하고, 이 값은 실시간으로 웹 콘솔에서 수정 가능
  • 이런 느낌…
if (isSwitchOn) {
    newService.doSth()
else {
    oldServce.doSth()
}
  • 이렇게 하면 새로운 서비스에서 장애가 강지될 때 바로 switch의 값을 변경하여 배포없이 기존 서비스로 롤백할 수 있다.

네번째 세션: 카카오톡 적용 사례를 통해 살펴보는 카카오 클라우드의 Kubernetes as a Service

  • 쿠버네틱스에 대한 대략적인 설명이 초반에 있었음
  • 백엔드 개발자가 서버와 Redis를 쿠버네틱스를 이용하여 관리하는 것을 보여줌
  • ‘쿠버네틱스 짱짱이야 써봐’ 이런 느낌이었음. 그 외에 기술적인 부분은 잘 모르겠음

세번째와 다섯번째 세션에선 듣고 싶은 부분이 없어서 주변에 있는 카카오 관련 회사들의 채용부스를 둘러 보았다. 각 회사 내부의 다양한 개발 문화나 복지에 대해 들어보고 싶었는데, 뭔가 스티커만 나눠주고 딱히 적극적으로 하지 않아서 별로 도움은 되지 않았다. 뭔가 다른 굿즈가 있을까 싶었지만 스티커가 끝…

개인적으로는 첫번째 세션이 가장 유익하고 재밌었던 것 같다. 어떻게 보면 나의 현재 관심사에 제일 부합하기도 했고 실제 사례들을 통해 보여주었던 것이 재밌었다. 하지만 Thread Pool관리에 대해서는 사실 생각해보지 않았던 부분이라 관련해서는 좀 더 찾아봐야 겠다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.