Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

Server services/Google Cloud

[Firestore] Distributed Counter

방피터 2022. 11. 28. 16:20

허용되는 Firestore 문서 업데이트 주기가 초당 1회야. 초당 1회를 넘어가면 보장을 못한다는 거겠지? 음.. 그러면 "좋아요, 👍, ❤️" 같은 거 구현하려면 망하겠네? 유명한 인플루언서가 올리면 좋아요? 하트? 가 미칠듯이 찍힐테니까 말이야 ㅋㅋ

이걸 어떻게 처리할 것인가??

이 문제를 해결하기 위해서 firebase 공홈에서 추천하는 방법이 분산 카운터야.

https://firebase.google.com/docs/firestore/solutions/counters

 

분산 카운터  |  Firestore  |  Firebase

Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 이 페이지는 Cloud Translation API를 통해 번역되었습니

firebase.google.com

뭐 거창한거 아니고 쉽게 설명하자면 어떤 필드, 예를 들면 "좋아요" 숫자를 기록하는 "likes" 필드가 있다고 치자고. 위에서 말한데로 유저가 좋아요 버튼을 눌렀을 때 해당 "likes" 필드를 직업 업데이트하면 안되겠지?  1초에 1번만 업데이트를 허용하니까.

그래서 subcollection으로 shard를 여러 개 만들고 유저가 좋아요를 누르면 랜덤한 shard를 선택해서 +1 하는 거지. 이론적으로 샤드가 10개면 1초에 10번 좋아요를 업데이트할 수 있으니까 ㅋㅋㅋ

위와 같은 식으로 구현하라고 문서에 되어 있다.

랜덤하게 같은 샤드를 선택하는 경우도 있을 수 있긴 한데 ㅋㅋㅋ 뭐 그렇다 치자고 ㅋㅋㅋㅋㅋ

그런데 읽을 때는? 샤드가 10개면 전부 다 읽어서 더해서 반환해야 하잖아 ㅋㅋㅋ 샤드가 차지하는 용량은 또 어떻고?? 이런 미친 불합리가 세상에 어딨어!!! -_-;; 참나... DB read에 쓰는 내 돈은 어쩌고;;;

하루 50,000 읽기가 무료
100,000 읽기당 $0.038

좋아요 말고도 저런식으로 counter를 기록해야 할 게 얼마나 많은데 말이야. 그치? ㅋㅋㅋㅋ 이런식이면 누가 firebase로 제품 개발하겠나? ㅋㅋㅋㅋ 그런데 이렇게 치명적인 문제가 있는걸 나도 아는데 google이 모를리가 있겠어? ㅎㅎㅎㅎ 더 찾아보니까 distributor counter extension을 준비해 놓으셨더라구 ㅋㅋ

https://extensions.dev/extensions/firebase/firestore-counter

 

Distributed Counter | Extensions Marketplace by Firebase

Records event counters at scale to accommodate high-velocity writes to Cloud Firestore.

extensions.dev

이 extension은 counter update를 cloud function에서 수행하도록 해서 내가 따로 shard 따위를 유지할 필요가 없지 훗 ㅎ 또 초당 10,000 회까지 업데이트를 지원하고 자동으로 합산되어 본 문서에 업데이트도 된다구!!!

다만!

  1. cloud function을 사용하므로 firebase 무료 버전에서는 사용할 수가 없고
  2. 설명이 매우 빈약해서 (씨발) 당최 어떻게 하라는 건지 알 수가 없어!
  3. version이 0.2.5 => beta라는 소리지;;; (베타가 너무 많아 구글형아.. 불안해서 쓸수가 있어야지 ㅆㅂ;;;)

이런 점들만 알고 정신승리한다면 나처럼 production에 사용할 수 있어. 꼭.. 정신승리!.

분산 카운터 extension

암튼 설명이 너무 빈약해서 어떻게 사용하는 건지 감이 안오더라구 -_-;; 개짜증;;; 그러다가 에라이 모르겠다 하고 일단 설치부터 했지 ㅋㅋㅋㅋ 전부 다음다음다음 누르고 맨 마지막에 cloud function 위치랑 업데이트 빈도만 설정하면 끝.

distributed counter extension 설치

업데이트 빈도는 firebase 콘솔 -> extension 탭에서 수정이 가능한데 cloud function 위치는 변경이 불가능하니까 잘 선택하자~

extension 탭에서 수정가능하다.

자 이제 설치가 되었으니까 테스트를 해봐야지? ㅎㅎㅎㅎ 막막~~~~ 뭐 _counter_shards_  서브 컬렉션에 쓰면 된다~~~ 뭐 이런 소리가 있으니까 써보자구.

... 영어가 해석이 안되냐;;; 아 똥멍충이...

distributed counter extension 동작 영상

동영상을 보면 알겠지만 어떤 문서의 _counter_shards_ 라는 이름의 하위 컬렉션에 문서를 생성하면 문서에 있는 필드의 값이 부모 문서에 들어가는 걸 알 수 있어. 한번 더 하면 합산되고 뺄 때는 -1로 값을 설정하면 돼. 또 필드 여러개를 업데이트 할수도 있다구!! 음!!! 매우 훌륭하군!!!

firestore read 대신 cloud function 수행때문에 폭탄 맞는 거 아냐? 라는 걱정에 cloud function 수행횟수를 확인해봤지 ㅋㅋㅋ 다행히도 update가 한번 수행되면 2, 3회 정도 호출되는 것 같아. ㅋ 폭탄 맞을 일은 없을 듯!

firestore read 대신 cloud function이 수행되어야 한다.

테스트는 이정도로 하고 내가 제작하고 있는 flutter 앱에 적용을 시작해봐야겠어 ㅎㅎㅎ 안녕!

반응형