동시성 이벤트 문제 해결은 어떻게 하지?

·2022년 7월 28일
3

Trouble shooting

목록 보기
2/2

뭔가 구현을 해보려다가 부하테스트 도구도 내 맘대로 안돌아가서 엎어졌다(...)

뭘 해보려고 했냐면 선착순이 연관되어있는 기능을 만들어보려고 했다.
선착순으로 쿠폰을 사용한다던가, 재고가 한정수량이라던가 하는 것을 말이다.

왜냐하면, 웹서비스에서는 정말 많이 사용하는 기능이라서....

이벤트로 선착순 100명에게 할인 쿠폰 증정! 이라던지 그런 일이 자주 있으니까.

그래서 막 찾아봤다, 먼저 해본 분들이 많을테니까

선착순 이벤트에 대한 기술적인 회고록
[Naver]콘퍼런스 참가 신청 기능 개발기
[우아한테크토크] 선착순 이벤트 서버 생존기! 47만 RPM에서 살아남다?!
[우아한형제들]선물하기 시스템의 상품 재고는 어떻게 관리되어질까?

....이해 못하는게 정상인가?

사실, 이런 이벤트는 자주 벌어지고 제일 어려운 문제라고는 이야기하더라 ㅋㅋ
왜냐하면 저걸 배타적 락을 걸어버리면 지연시간이 미친듯이 발생할테니 말이다.

그래서 사진 속에서는 레디스를 사용한다던가, 큐시스템을 도입하여 대기열을 만든다고 하는데

단순하게 딱 쿠폰 100장이 2초내로 다 털리는 상황이 온다면? 이라는 가정으로 고민을 해봤다.

(단순하진 않나?)

어떤 쿠폰에 대기열이 존재하겠는가. 그냥 누르면 내껀데(ㅋㅋ)

그래서 이걸 테스트해보려면 테스트 도구가 필요하다고 생각해서 Apache의 JMeter를 가져왔는데......

GraphQL 쿼리를 도대체 어떻게 쏴야할지 모르겠다(....)

과거에도 GrahpQL을 사용하여 REST Clinet를 사용하면서 무쟈게 열받았는데
또...또 나를 괴롭히는 것 같다(심지어 결국 해결도 못했음)

아니 무슨 호출방법이 사용하는 스택마다 전부 다 다르면 도대체 어쩌라는건지 짜증이 MAX고 공식문서에 적힌대로 따라해봤는데?

안돼

(미치겠네 진짜)

REST API를 사용해서, 부하 테스트가 정상적으로 작동하는지는 확인했는데
내가 원하는 API는 GrahpQL로 되어있어서 이것을.... 어떻게 실행을 해보진 못했다.

그래서 그냥 생각만. 생각만 하고 있는 것은 아래와 같다.

DB는 제 기능을 못할 것이라 생각한다.
좋아요 버튼 구현한다고 1초에 광클했더니 고장나는거보면 분명 문제가 생길 것이다(...)

그래서 Redis를 활용해서, TTL을 한 30분정도로 적용시켜놓고
한번 호출이 될 때 마다 레디스에 입력되어있는 값이 빠져나가고
trigger나 subscriber를 사용해서 호출 될 때 마다 해당 유저의 값을 DB에 담아서 기록을 남겨놓으면서

레디스의 값에 대한 수정이 이루어지면 되지 않을까 한다.

왜냐하면 레디스는 싱글스레드로 구성이 되어있기 때문에
어짜피 시간 오차가 거의 없다고 해도, 순차적으로 작업이 진행될테니 되지 않을까?

라고 생각을 하고 있다가 옆에 켜놓은 배민의 기술블로그를 보니 같은 내용이 적혀있었다.

123번은 같은 이야기를 하고 있는데, 4번은 솔직히 잘 모르겠다.

레디스와 멤캐시드의 차이가 컬렉션의 다양성에서 오는 것인데
지금까지 레디스의 컬렉션을 사용해본 적이 없어서(.....)

Set 자료구조가 중복을 허용치 않는 것이라는건 알고 있긴 하다(JS에도 있음)
아무튼 구현 자체는.... 생각보다? 할만할 것 같은데

그 JMeter로 GraphQL HTTP 통신 예제 구합니다...

profile
물류 서비스 Backend Software Developer

0개의 댓글