Computer Science

[프로젝트 회고] 광고 성과 최적화

최근 회사에서 진행했던 프로젝트에 대한 간단한 소개와 어떤 구조의 시스템으로 설계되었는 지 설명해보려고 한다.


프로젝트의 이름을 붙여보자면 '광고 성과 최적화' 정도가 될 듯하다.
간단히 소개하자면, 초반에 광고들을 특정 횟수이상 만큼을 노출시킨 후, 성과를 측정해서 더 성과가 좋았던 광고를 선택해서 재생시키는 시스템이다.
성과를 어떻게 측정하냐고 물어본다면, 측정을 위해서는 MAB 알고리즘이 사용되는데, MAB모델 / 알고리즘보다는 해당 프로젝트의 시스템 자체에 대해 작성하고자 한다.

 

아키텍쳐 구성도

이 프로젝트에는 크게 서버에서 작동되는 코드가 있고, 광고가 재생 및 노출되는 클라이언트에서 작동되는 코드가 있다.
서버로는 크게 스케줄러 서버와 api 서버로 구성되며, 서버 사이드와 클라이언트 사이드에서 어떤 내용들이 각각 수행되는지 알아보겠다.

 

1. 스케줄러 서버

스케줄러 서버는 광고 노출 로그 데이터들을 수집하고 성과를 측정하는 역할을 한다. 순서대로 설명해보자.

  1. athena 서비스를 사용하여, S3버킷에 저장된 로그 (리워드 재료가 될) 데이터를 쿼리로 불러온다.
  2. 불러온 데이터를 사용하여 MAB 알고리즘 실행하고, 결과로 얻은 각각 광고 컨텐츠 별 모델이 정해진다. (즉, 모델의 분포와 파라미터 정보를 얻는다.)
  3. 앞에서 얻은 분포와 파라미터 정보를 postgresql 데이터베이스에 저장한다.

 

시스템의 구성요소

  • 서버: 이 시스템의 모든 구성 요소를 실행하는 컴퓨터로, 해당 프로젝트에서는 스케줄러 서버로 불린다. Amazon EC2로 구성된다.

  • S3 버킷: Amazon S3의 버킷. 광고 노출시의 로그 데이터가 저장되는 곳이다.

  • Athena: Amazon Web Services의 분산 쿼리 서비스. SQL 쿼리를 사용하여 Amazon S3에 저장된 데이터를 분석할 수 있다.
    더보기
    아테나에 대한 간단한 메모)
    - AWS athena 서비스 . 데이터베이스라고 생각하고 있었으나, 아주 크나큰 오산이었음.
    - S3에 있는 데이터를 사용해서 interactive하게 쿼리(표준sql쿼리 사용)할 수 있는 서비스.
    - 서버리스 기반.
    - 데이터 분석 작업을 할 때 사용됨. (팀에서 소프트웨어 엔지니어링을 주로 하다보니, 통계 분석업무를 하시는 분들께 들어만 보다가 처음으로 접하게 되어 이제서야 주섬 주섬 공부)
    - 다양한 데이터 형식 지원. (주로 비정형데이터, 로그파일 등을 분석하는 데에 사용됨.) 
    - 사용자 정의 함수를 사용해서 데이터 처리를 확장할 수 있음.
    - presto 쿼리 엔진 기반( 아직 잘 모르는 부분 )
    - 데이터를 기본적으로 분할 & 병렬 처리 -> 쿼리 속도가 빠름.
    - 서버리스 아키텍쳐 -> 인프라 구성/관리 필요없음. + 필요에 따라 확장 가능.
  • MAB 알고리즘: Multi-Armed Bandit 알고리즘. 유저가 선택할 수 있는 여러 옵션(arm) 중에서 가장 최선의 옵션을 선택하는 방법을 학습하는 알고리즘이다.

  • 데이터베이스: 시스템에서 사용하는 데이터를 저장. 해당 프로젝트에서는 MAB 모델의 분포와 파라미터를 저장하기 위해 데이터베이스를 사용하며, postgresql로 구성한다.

 

2. api 서버

typescript + nestJS로 구현되어있다.
이 부분은 아직 잘 모르고, 당장 필요한 api를 구현만 해 본 상태라서 별도의 공부와 함께 글을 작성해 볼 예정이다.

 

 

3. 광고 재생 클라이언트

광고를 재생하는 클라이언트(EDGE)는 광고 성과가 가장 높은 광고를 선택해서 재생하는 역할을 한다.
컨텐츠 셀렉션 시스템이라고 요약할 수 있겠다.

  1. 광고가 노출되는 시점에, 광고 로그 데이터들을 수집하여 S3버킷에 저장한다.
  2. 팀내 클라이언트향 api를 통해 데이터베이스에 저장한 분포 정보를 실시간으로  받아온다. ( 실시간을 목표로 하지만, 현재는 하루에 한 번정도 분포가 변경되는 정도로만 실험 중 )
  3. 받아온 분포 정보를 기반으로 난수를 생성한다. 이 난수는 광고 컨텐츠들 중 가장 높은 리워드를 예측하는 데에 사용된다.

 

시스템의 구성요소

  • 로그 수집 시스템: Fluent-bit을 활용해서 준 실시간으로 S3버킷에 저장하고 있다.

  • 클라이언트: 광고가 노출되는 현장에서 컴퓨팅을 담당하는 엣지 컴퓨터이다.

  • api: 분포 정보를 요청할 때 사용하는 rest API이고, typescript + nestJS로 구현한다.

 

 

사용 기술 스택
  • AWS EC2: 스케줄러 서버, api 서버

  • AWS S3: 로그 데이터 저장소

  • AWS Athena: 로그데이터 쿼리

  • Postgresql: 데이터베이스 구축 및 알고리즘이 생성한 결과 저장

  • Python: 스케줄링 시스템과 MAB 알고리즘 코드 구현

  • Typescript + nestJS: api 구현

  • fluentbit: 로그 수집 시스템

 



이미 구축되어 있는 시스템들이 있었고, 프로젝트를 진행하는 중에도 제대로 이해하지 못하고 사용하는 aws서비스들이 많았다. 예를 들어, 데이터베이스로 어떤 서비스를 활용할까 결정할 때도, 사용해보지 않았거나 잘 모르는 영역들이 많아 의사결정하는 데에 어려움을 겪었다. 그래서 다음 글에는 aws구조와 서비스들에 대한 이해를 해보는 시간을 가지려고 한다.

추가로 fluent-bit(사이트)도 소개해보고싶고, 최근 api 작업을 할 일들이 많았는데 ts + nestJS로 구현하는 api에 관해서도 공부해보는 시간을 가져보려고 한다.

끄읕.