기능 개발

캐시워크 for Business 채널 프로젝트

300만 DAU를 위한 채널 메시지 시스템 구축 프로젝트

2023-11 ~ 2024-02
3 months
AWS SQSElastic Beanstalk WorkerRedisNode.jsNest.js

작업 내용

캐시워크 for Business 채널이란?

"캐시워크 for Business 채널"은 캐시워크와 계약을 맺은 외부 업체가 채널을 개설하여 캐시워크 내 채팅 서비스인 "캐시톡"에서 채널 메시지를 발송할 수 있는 서비스입니다. (카카오 비즈니스의 "채널 메시지" 기능을 떠올리시면 쉽습니다.)

채널 메시지란?

채널 메시지는 외부 계약 업체와 캐시워크 사용자들 간 소통할 수 있는 채팅방으로 전송되는 메시지를 의미합니다.

캐시워크 for Business 채널에서 발송할 수 있는 메시지의 종류는 다음과 같습니다:

  • 웰컴 메시지: 채널 구독 시 채널에서 사용자에게 발송하는 메시지

  • 일반 메시지: 채널에서 특정 사용자 그룹(OS, 성별, 연령대)에게 발송하는 메시지

    일반 메시지 예시일반 메시지 예시

정량적 성과

캐시톡 유저 활성화에 기여 (“일반 메시지” 발송 이후: 2024-09-04)

  • 캐시워크돈버는 미션” 홍보 일반 메시지 발송 이후 캐시톡 Active Users 급증
    • 일주일 전 동요일 대비 160% 증가
  • 캐시워크 → 캐시톡 신규 방문 유저 급증

'돈버는 미션' 일반 메시지'돈버는 미션' 일반 메시지

캐시워크 “돈버는 미션” 일반 메시지

설계 설명

(설계 설명 문서는 Notion 으로..)

설계

기술적 과제

대용량 트래픽 처리

  • 한국 캐시워크 기준 DAU 300만 명의 사용자에게 안정적으로 웰컴 메시지를 전송해야 하는 과제가 있었습니다.
    • 요구 사항: 유저가 캐시워크 홈에 진입하면 웰컴 메시지 발송
  • 이를 해결하기 위해 AWS SQS Standard Queue 를 활용하여 웰컴 메시지 및 일반 메시지를 분산 처리하였습니다.

메시지 발송 및 예약 발송 기능

  • Elastic Beanstalk Worker 환경을 구축하여 웰컴 메시지 발송 및 일반 메시지 예약 발송 기능을 구현하였습니다.
  • Redis를 이용해 메시지 발송 성공/실패 횟수를 측정하고, 발송 현황을 실시간으로 파악할 수 있도록 구현했습니다.

추후 공수를 줄이기 위한 선제적 개발

  • 초기에는 “인구 정보(demography) 기반 메시지 전송 기능”이 추후 개발 예정 항목으로 분류되었으나, 이를 미리 구현하여 개발 공수를 절약할 수 있었습니다.
  • 이 작업으로 인해 추후 캐시워크 전체 유저를 대상으로 사용자가 구독한 키 값 분리 작업을 대규모로 수행하지 않아도 되도록 했습니다.

상용 배포 시 어려움

  • 정해진 릴리즈 일자를 준수하기 위해 유저 의존성이 없는 항목을 우선하여 상용 배포하여 배포 소요 시간을 단축할 수 있었습니다. (60분 → 30분)
    • 유저가 사용하지 않는 백오피스 서버를 유저 단 API 서버와 함께 배포함으로서 배포 소요 시간 단축

작업하면서 어려웠던 점

상용 배포 이후 모니터링 과정에서 발견된 문제들

구독 가능한 채널의 토픽 수가 초과되는 문제

[ 문제 배경 ]

캐시워크 공식 채널은 채널 채팅방 그룹당 최대 10,000명의 유저를 수용하도록 설계되었으나, 구독자가 증가하면서 그룹 번호가 부족해 일부 유저의 구독이 실패하는 문제가 발견되었습니다.

  • 채널 채팅방 그룹이란: 기본 채팅방 ID(e.g., ch:342:android:m:1994) 뒤에 숫자(그룹 번호)를 붙여 유저를 분산하여 구독 처리하는 방식
  • 한 그룹 번호 당 10,000명을 수용하며, 초기에는 그룹 번호를 :0 ~ :9로 설정(총 100,000명까지 수용 가능).
    • 예시: ch:342:android:m:1994:0

[ 발생 상황 ]

  • 채널 구독자가 100,000명을 초과하면서 존재하지 않는 그룹 번호 :10 이상에 대한 구독 시도가 발생하였습니다.
  • 이로 인해 구독 실패 유저 증가 및 일부 유저의 채널 메시지 수신 불가 문제가 발생하였습니다.

[ 해결 방안 ]

  1. 신규 구독 유저를 임시로 모아둘 Queue 생성
    1. 신규 채널 구독 요청을 처리할 수 없으므로, 신규 채널 구독 요청을 모아둘 임시 Queue 를 생성합니다.
  2. 메신저 서버의 채널 채팅방 그룹 확장
    1. 이어서 메신저 서버 측에서 수용 가능한 그룹을 기존 10개에서 50개로 추가 개설합니다. (최대 500,000 명 구독 가능)
  3. 구독 실패 유저 데이터 정리:
    1. 한국 캐시워크 서버에서는 실패한 구독 데이터(구독된 그룹 번호가 11 이상인 유저의 구독 데이터)를 삭제 후, 새 그룹 번호로 재구독할 수 있도록 조치합니다.
      1. 캐시워크 메인 진입 시 자동으로 신규 구독 처리됨
  4. 구독 Worker 재시작: 최종적으로 새로운 유저들이 채널을 구독할 수 있도록 임시 Queue를 Worker 서버와 연결
    1. 임시 Queue 에 쌓여 있던 구독 요청이 해소되면서 채널 구독이 진행됨

사업적인 방향성을 고려한 설계

  • 초기 기획은 “캐시워크 공식 채널” 로, 캐시워크 내부 서비스에 대한 홍보 채널로써의 기능만을 하는 기획이었음
  • 하지만, PM 님과 소통하면서 해당 기능은 캐시워크 내부에서만 사용되는 것이 아니라 외부 업체와의 계약을 통한 홍보 매체로 활용될 수 있는 기능이라는 결론을 내렸고
  • 이에 따라 신규 채널을 개설하면 캐시워크 for Business 채널 기능을 활성화할 수 있도록 하는 인터페이스를 미리 개발함

아쉬웠던 점 및 향후 방향

로깅을 조금 더 꼼꼼히 남길 걸..

  • 메시지 전송 도중에 문제가 발생할 수 있는 지점을 식별하여 로그를 심어두었어야 했음
  • 일반 메시지 전송 시 현재 전송중인 채널 채팅방 ID를 로깅하여 개발 단에서 확인하고 문제 발생 시 즉각적으로 대응할 수 있도록 개발했어야 한다고 생각한다.
  • 특히 외부 업체와의 계약으로 채널을 개설하고 메시지를 발송하는 경우 이러한 부분이 더욱 중요하다.
    • 문제 발생 시 언제든지 메시지 발송을 중단할 수 있는 메커니즘이 필요하다고 생각..