2023 우아콘 - 대용량 트래픽을 받는 모놀리식 서비스에 Woowa하게 RPC 적용하기

주노·2023년 11월 16일
0

2023 우아콘

목록 보기
2/3
post-thumbnail

대용량 트래픽을 받는 모놀리식 서비스에 Woowa하게 RPC 적용하기


  • 시간: 14:00-14:40
  • 발표자: 박경태(배민커머스서비스실), 장재주(배민푸드서비스개발팀)

대용량 트래픽, 모놀리식 이라는 용어는 익숙하나 RPC라는 용어는 생소해서 궁금해서 해당 세션을 들어봤다.
생소한 내용이라 제대로 이해는 못했지만 나름 주워들은 키워드에 대한 내용만 간략하게 정리해두려고한다.

본 내용은 대략적으로 이해한 내용을 다루고 있습니다.
잘못된 지식이 있을 수도 있으니 해당 내용을 100% 신뢰하지 마시길 바랍니다 🙏
잘못된 정보에 대한 피드백은 항상 감사합니다 🙇‍♂️

RPC란?

Remote Procedure Call: 원격 프로시저 호출이라는 뜻으로 별도의 원격제어를 위한 코딩 없이 다른 컴퓨터에서 함수나 메소드를 실행할 수 있는 기술이다.

예를들어 클라이언트와 서버가 있다고 가정해보자.

클라이언트는 어떤 함수를 호출할 수 있는지 알아야하고 서버는 어떤 함수를 제공해야하는지 알아야한다.
RPC는 IDL이라는 인터페이스 언어를 이용하여 이러한 명세를 작성하도록 한다.

RPC는 하나의 개념일 뿐 gRPC와 같은 다양한 구현체가 존재한다.

배민의 RPC 적용과정

배민 푸드서비스 개발팀은 다음과 같은 일을 하고있다.

  • 가게 탐색 (가게목록)
  • 주문 전환(가게 상세, 메뉴 상세)
  • 외부 시스템의 데이터(서포트)

문제 인식

배민1 서비스를 오픈하면서 관리 할 코드가 20만줄을 넘긴적이 있었다.
리팩터링을 통해 20만줄 아래로 내리긴 했는데 그럼에도 코드 수는 계속 증가하고 있는 추세다.

또한 다양한 일을 하다보니 멀티 모듈로 관리하고 있는 프로젝트의 코드를 유지보수하기 어려워지기 시작했다.

이에 시스템을 작은 단위로 분류하고자 RPC를 적용하기로 결심했다고 한다.

검토 과정

비즈니스 로직을 수행하는 서버 하나를 여러개의 서비스로 분리하는 작업을 진행했다.
공통 코드를 어떻게 관리하는가? 가 주요 수행 과제였다.

이에 다음과 같은 검토 과정을 거쳤다.

  1. 공통된 코드를 라이브러리로 제공하기
    1. 저장소에 접근하는 코드가 각각의 서비스에서 실행되기 때문에 언젠가는 개발자가 이 코드를 전부 봐야한다.
    2. Application 러닝타임이 길다.
    3. 저장소 커넥션이 길다
    4. 자원관리의 주체가 명확하지 않다.
  2. REST API 방식으로 제공
    1. 통신 레이어가 증가하면서 레이턴시가 증가할 여지가 많음
    2. 대용량 트래픽을 받는 입장에서 부담이됨.
    3. 데이터를 받아가기 위한 클라이언트 코드를 각각 구현해야한다.
    4. 데이터 버전관리가 명확하지않음
  3. RPC 방식으로 제공
    1. 클라이언트 코드 각각 구현이라는 부분을 해소할 수 있었다.
    2. 개발자들이 RPC 방식에 익숙히지않다는 단점이 있었다.
      1. 이 부분은 RPC에 해당하는 부분을 잘 추상화 하여 적용하기로 결정

우아한 RPC 적용과정

  • 고민1: IDL 파일의 관리
    • RPC를 적용하면서 800개가 넘는 IDL 파일이 생성되었다. 기능이 많아 추상화할 기능도 덩달아 많아졌기 때문이다.
    • 이에 유지보수의 어려움이 우려되었다.
  • 고민2: 확장성
    • RPC 적용 당시 기존 구성원들의 이해도에 맞춰 Thrift를 사용하기로 했었다.

      🪶 apache Thrift

    • 하지만 다른 부서에서 gRPC에 대한 요구사항이 증가하면서 gRPC나 Thrift나 모두 상관없이 사용할 수 있도록 제공하고자 했다.

따라서 다음과 같은 요구사항이 나왔다.

  • 기존 자바 클래스를 최대한 활용하여 유지보수 편하도록
  • RPC 구현체를 선택하여 사용할 수 있도록
  • 기존 Spring의 사용성과 크게 차이가 없도록

최종 산출물

그래서 우아한형제들에서는 RPC를 사용하기 용이한 WoowaBoot를 만들었다.

일반적인 Http Controller와 최대한 유사하게 만들었다. @WoowaBbootController, SampleService 인터페이스를 추가하면 구동 가능하도록 구현했다.

시작하는 방법: SpringBootApplication -> WoowaBootApplication
WoowaBootApplication의 module 속성으로 gRPC, Thrift 구현체를 선택 가능하다

  • IDL: 자바 인터페이스가 IDL 역할을 한다.
  • Client: WoowaRpcFactory에 DNS, IP 등의 정보를 세팅하여 사용한다.
  • 서비스 메시: 서비스 적용하기위해서는 1대 이상의 서버들이 구동되어 운영된다.
    • L7, L4, DNS 등을 활용한 방법을 사용하여 직접적으로 호출도 가능하다. 하지만 장기간 안정적으로 운영되기 어렵다.
    • 관리포인트가 늘어나는 점이나 운영경험, 구현까지의 기간을 고려하여 Zookeeper를 사용하기로 결정

      서비스 메시는 서비스가 애플리케이션 수명 주기 전반에 걸쳐 데이터와 일관성을 공유하며 서로 통신할 수 있도록 지원하는 사전 구성된 애플리케이션 서비스를 의미한다.

후기

RPC에 대해 깊게 와닿지도 않았는데 갑자기 짜잔~ 하고 라이브러리를 구현하셔서 꽤 많이 놀랐다.
아직 미지의 영역이 너무 많은 것 같다...

Reference

profile
안녕하세요 😆

2개의 댓글

comment-user-thumbnail
2023년 11월 16일

주노 몸이 8개였으면 모든 트랙 다 참석시키는건데..

1개의 답글