개발 배경 및 구현 아이디어

  • Velog에 작성한 게시글들 조회수가 궁금한데 매번 로그인해서 확인하기 귀찮음
  • Velog 내부 조회수 API 리버싱해도 되지만 귀찮아질 것 같고 확장성(ex. 방문자 알림)이 떨어짐
  • 예전 국내 메일 서비스들이 픽셀 이미지를 이용해서 읽음 확인 기능을 제공하던 것이 생각남
  • Velog는 Markdown 문법을 이용한 게시글 작성을 지원함
  • 브라우저는 cross-site 도메인이여도 단순 이미지 호출은 차단하지 않음
  • 게시글에 1x1 픽셀의 투명 이미지를 삽입하면, 게시글이 조회될 때마다 서버 측에서 호출 기록을 남길 수 있음
  • 대부분의 Velog 유저들의 게시글은 하루 1,000명 이상의 방문자가 나오지 않음. 이 정도 트래픽에는 Workers KV를 이용해도 충분함
  • Velog 한정이 아닌, Markdown 문법으로 이미지 삽입을 지원하는(사용자 도메인에서 이미지 제공이 가능한) 플랫폼이라면 모두 사용 가능

작동 방식

  • 이미지에 식별 값(slug)을 부여 후 CDN이 아닌 프로그래밍 가능한 Workers를 이용해 응답을 제공하고, 식별 값을 KV의 Key prefix로 사용해서 호출 기록을 저장하면, 간단하게 페이지 뷰를 구할 수 있음
  • 날짜, ip, userAgent, 이미지 식별 값Hash 함수를 이용해 key 값으로 만들면 최소한의 중복 방문 처리가 가능함
    • HASH: SHA-256 기반 128비트 해시를 base64url(22자)로 인코딩.
    • KEY: view:${slug}:${hash}.
    • VALUE: UserAgent, Date...
  • Workers KV 무료 플랜은 하루 1,000개의 PUT, LIST를 지원함.
    • PUT: 하루 1,000개의 방문자 카운팅 정보를 저장 가능
    • LIST: 하루 1,000개 이상의 페이지 뷰 정보를 제공 가능
  • 페이지 뷰 조회 요청에는 LIST 명령을 사용하는데, 식별값(slug) 정보를 prefix로 이용해서 가져온 후 이를 단순 카운팅하면 됨
    • 페이지 뷰 조회는 실시간성이 크게 중요하지 않으니 응답 값을 적절히 캐싱하면 하루 1,000개 이상의 요청 처리가 가능해짐

한계

아무래도 빠른 개발을 위해 단순한 저장소인 KV를 사용하다 보니 다음과 같은 한계가 있음.

  • Eventual consistency: Workers KV PUT 요청은 실시간이 아님. 실시간성이 꼭 필요하다면 Durable Objects(DO)를 사용해야 함.
  • LIST 의존: LIST 명령을 이용한 카운팅 방식은 (페이지 뷰가 꾸준히 나온다는 가정하에) 시간이 지나면서 가져와야 하는 KEY 값들이 많아질수록 느려짐. Cron 작업으로 꾸준히 저장 구조를 업데이트하거나, DO 또는 Analytics Engine 사용을 고려해야 함.

지원 예정

최대한 빠른 시일 내에 다음과 같은 기능들을 추가할 예정.

  • 날짜별 정렬: 서버리스 블로그 댓글 API 30분 만에 만들어보기에서 최신 댓글 정렬을 위해 사용한 방식인 Unix Time을 이용하면 최신 세션 기준으로 정렬된 목록을 제공할 수 있음
  • API 보안: 미들웨어 추가로 지원 예정. HTTP Authorization 헤더를 이용할 예정
  • Rate Limit: 인기 Velog 유저라면 시기와 질투에 눈이 먼 사용자들이 악의적 요청을 날릴 수 있으니 대비책이 필요합니다. 아마 본인은 해당되지 않아서 가장 마지막에 추가될 예정...
  • 검색: API 추가로 지원 예정
    • 날짜: 특정 날짜, 기간별 검색 기능. KEY 구조 변경 필요
    • 세션: 특정 세션 활동 정보 검색 기능. 현재 세션 정보는 각 포스팅에 대해서 하루 동안 유효함. 개인정보보호 정책 검토 필요
    • 브라우저/OS: UserAgent에서 파싱 한 정보로 제공 예정. 정교하진 않아도 대략적인 파악이 가능함
  • 서비스 API: 누구나 쉽게 이메일 인증 + 개인키 발급으로 사용할 수 있도록 API를 서비스 형태로 제공 예정
    • 웹훅: 페이지 뷰 이벤트 발생 시 POST 요청 제공. 개발자들이 좋아하는 Slack을 이용한 알림 가능해짐
    • 이메일: 웹훅 처리가 귀찮은 사용자들을 위해 고전이지만 편리한 알림 기능
    • Custom campaign: 설정된 이벤트(ex. 특정 조회수 도달)가 통합된 이미지 식별 값(slug) 제공

추가