[2023‐12‐04] 스크럼 - boostcampwm2023/and01-SnapPoint GitHub Wiki

Day01 스크럼 회의

이번주 할 일

Android

정건

  • 스냅포인트 클러스터링

승빈

  • 동영상이 포함된 게시글 작성
    • 최대 30초, 컷편집, (30초 안넘으면 편집 x)

언수

  • 게시물 오프라인 저장 + 게시글 수정
    • 저장 - room

Backend

  • 재현
    • 캐싱 마무리
    • 동영상 업로드
    • 동영상 처리
  • 희범
    • 파일 API 보안 제한
    • 파일, 이미지 인스턴스 NCP에 배포
    • 게시글 요약, 이미지 유해 검사 AI 서비스 결합
    • NCP 인프라 작업 (Compute 서버 2개 초과 안하게!)
    • 챗지피티랑 씨름해서 로고 작업 마무리하기..

image

image

  • 231203

    파일 API 분리

    Presigned URL?

    • S3 버킷(NCP)에 접근 가능한 URL을 주고, 클라이언트에서 URL에 대신 요청을 보냅니다.
    • 업로드를 클라이언트에서 처리하게 함으로써, 서버와 네트워크 부하가 감소합니다.
    • 대신 우리 서비스는 한 게시글 당 파일 10개 이상 첨부하는 경우 많습니다.
      • 그렇다면 업로드 요청 + 완료 까지, 총 20번의 요청을 보내야 합니다. (요청 복잡도 Up)
      • 완료 시 파일 데이터를 저장하고, 데이터를 가공해 클라이언트에 응답해야 합니다.
    • 또한 검증도 서버에 비해 부족하다.
      • Content-Length-Range으로 파일 크기를 제한할 수 있다.
      • 하지만 선정성을 띄거나 저작권에 침해되는 사진일 경우? → 서버 측에서 AI로 검증 하기로 했는데, 이게 불가능해진다.
      • 또한 모바일 환경이라 파일 업로드 까지 꽤 시간이 걸릴 수 있다. 만약 20개 파일을 모바일 환경에서 보내야 한다면, Presigned URL 시간을 보수적으로 잡을 수 밖에 없다. (유출 위험과 도용 위험이 높아진다)

    → 클라이언트 요청 복잡도와 검증이 복잡해 사용하지 않기로 판단

    [S3 Presigned Url 도입하기 (+Java로 파일 크기 제한[content-length] 추가) (velog.io)](https://velog.io/@invidam/S3-Presigned-Url-%EB%8F%84%EC%9E%85%ED%95%98%EA%B8%B0)

    [S3 file upload with Presigned url (tistory.com)](https://bae-ha.tistory.com/24)

    어떤 방식을 사용할까?

    Publish/Subscribe

    대중적인 사용 예시는 다음과 같다.

    **실시간 데이터 피드:**
    예: 주식 시장 데이터, 스포츠 점수, 뉴스 업데이트.
    시나리오: 실시간으로 변화하는 데이터를 다수의 사용자나 시스템에게 즉각적으로 전달해야 하는 경우. 발행자는 데이터를 발행하고, 구독자는 이를 실시간으로 수신합니다.
    
    **분산 로그 처리:**
    예: 시스템 로그, 트랜잭션 기록.
    시나리오: 대규모 시스템에서 발생하는 로그를 여러 처리 시스템(예: 로그 분석, 모니터링, 보안 감사)에게 전달해야 할 때. 각 로그 이벤트는 발행되고, 관련된 구독자가 이를 수신하여 처리합니다.
    
    **이벤트 드리븐 마이크로서비스:**
    예: 주문 처리, 재고 관리.
    시나리오: 마이크로서비스 아키텍처에서 서비스 간의 결합도를 낮추고, 이벤트 기반으로 독립적인 서비스가 작동해야 할 때. 한 서비스의 이벤트가 다른 서비스의 동작을 트리거합니다.
    
    **알림 및 메시징 시스템:**
    예: 이메일 알림, 푸시 알림.
    시나리오: 사용자에게 알림이나 메시지를 보내야 할 때, 발행자는 알림을 발행하고, 구독자(사용자의 디바이스나 이메일 서버)는 이를 수신합니다.
    
    **분산 태스크 큐:**
    예: 비동기 작업 실행, 배치 처리.
    시나리오: 장시간 실행되거나 지연이 허용되는 작업을 분산 시스템의 다른 부분에서 실행해야 할 때. 작업 요청이 발행되고, 구독자가 이를 받아 처리합니다.
    
    **리소스 상태 모니터링:**
    예: 서버 상태 체크, IoT 장치 상태.
    시나리오: 네트워크의 다양한 리소스 또는 장치에서 발생하는 상태 업데이트를 모니터링하고 관리해야 할 때. 각 장치 또는 리소스에서 상태 정보가 발행되고, 모니터링 시스템이 이를 구독하여 관찰합니다.
    
    • 즉, Pub/Sub 방식은 여러 마이크로 서비스가 데이터를 공유하고 소통하는 것에 중점을 둔다.
      • 동일한 데이터가 여러 시스템, 서비스에서 필요한 경우에 적합하다. (알림, 주식 정보)

    Message Queue

    Untitled

    이미지 업로드, 처리 등은 메세지 큐 방식이 적합하다.

    RabbitMQ? vs Kafka

    이 방식을 사용하려면, 중앙에서 이벤트 및 요청을 중개하는 Broker가 있어야 한다.

    메세지 브로커 (Message Broker)

    이벤트 브로커 (Event Broker)

    • 이벤트 브로커는 publisher가 생산한 이벤트를 데이터베이스에 저장 하듯이 보관한다.
    • (장애가 난다면) consumer가 특정 시점부터 이벤트를 다시 읽어갈 수 있어 안정성이 높다.

    NCP에서 사용할 때, Kafka 사용하면 월 약 7만원 넘는다. (비싸서 포기)

    RabbitMQ는 컴퓨트 서버와 결합되고, 자체는 무료다. (프리 티어로?)

    [[Project] 프로젝트 삽질기9 (feat Queue, bull) (tistory.com)](https://overcome-the-limits.tistory.com/673)

    RabbitMQ로 이미지 처리 및 업로드 분리하기

    RabbitMQ는 바이너리 데이터 전송 잘 안된다. 그렇다면 data.buffer.toString('base64'); 인코딩을 사용해야 할까?

    RabbitMQ로 직접 파일 데이터를 옮기는 것은 옳지 않고, 파일 API를 따로 분리해서 사용자가 개별 업로드하게 만들자.

    파일 API 인증?

    • JWT 토큰이 해독되는지 여부만 생각하자.
    • 이후 API Gateway 등을 사용해서 files/ 엔드포인트만 돌릴 것이므로, 토큰 발급 등은 메인 API에 위임한다.
    • 아니면 내부적으로 httpService 사용해서 요청-응답하는 것도 괜찮은듯.

    이벤트 기반 vs 요청-응답 기반?

    • 무엇을 분리하려 했는지 생각하자. I/O 작업 (DB 쓰기, 이미지 처리)을 기다리지 않고, Event로 던져 두고 파일 API에서 즉시 응답한다.
      • 만약에 파일 데이터 쓰기 실패했을 때는 어떻게?
    • 용우님한테 물어보자.

    각각 서비스 어떻게 분리할까?

    Untitled

    • 편의성과 확장성을 위해 nest.js 마이크로서비스로 분리한다.
      • RabbitMQ 말고도 다른 방식을 많이 지원하고, 편하게 연결 가능하다.

    [Documentation | NestJS - A progressive Node.js framework](https://docs.nestjs.com/microservices/basics)

    • 메인 API는 특성 상, ClientService 가 될 수 있으므로 하이브리드 앱으로 만든다.

    [Hybrid application - FAQ | NestJS - A progressive Node.js framework](https://docs.nestjs.com/faq/hybrid-application)

    결과물

    • 메인 API에서 NCP 업로드 및 관리 책임을 완전히 분리하고, 데이터의 CRUD 및 조립만 담당하도록 책임과 역활을 명확히 구분했다.
    • 파일 API는 별도의 엔드포인트로 분리해 메인 API의 부하를 줄일 수 있다. 파일 API는 S3 버킷(아니면 다른 거)에 접근해 파일을 업로드 하는 역할과 책임을 가진다. (Auto-Scaling 적용해볼 수 있을까?)
    • 미디어 프로세스 마이크로서비스는 이벤트 기반으로 동작하며, 이미지 축소 및 압축을 수행한다.
      • 내부적으로 Stream 을 잘 사용하도록 신경씀

    Screenshot_2023-12-04-01-08-15-762.jpeg

    Screenshot_2023-12-04-01-08-35-823.png

    AMQP란?

    [[AMQP] AMQP(Advanced Message Queuing Protocol) (tistory.com)](https://xzio.tistory.com/2024)

    앞으로 할 일?

    NCP에 어떻게 인프라 구성할지 생각해보자.

    Untitled

    • 다른 팀 인프라 구조 파악하고, 어떻게 이것 적용할 지?
    • 일단 API 게이트웨이로 파일, 메인 API를 묶어서 배포해야 한다.
      • 각각 파일, 메인 API 서버는 독립적으로 구성한다. (Auto-Scaling 가능할지?)
    • RabbitMQ를 위한 인스턴스를 만들어야 한다.

오늘 할 일

Android

승빈

  • 게시글 작성 동영상 블록 추가

언수

게시글 오프라인 저장 - room

Backend

  • 재현

    • 캐싱 마무리
  • 희범

    • NCP 인프라 설계
      • 파일 업로드, 이미지 인스턴스 NCP 배포