Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[게스트 모집] 경기 상태 변경 배치에서 Redis Expire Event로 변경 작업 #278

Merged
merged 2 commits into from
Jan 20, 2024

Conversation

Hchanghyeon
Copy link
Member

👨‍💻 작업 사항

개요

  • 경기를 생성하고 경기의 상태(모집 중, 모집 마감, 경기 종료)를 변경해주는 로직이 없어 클라이언트 단에서 시간 계산을 통해 UI에서만 경기 상태가 변경되어 보였음
    • 현재 시간이 경기 시작 시간을 지났을 때 경기 상태를 모집 중 -> 모집 마감으로 변경
    • 현재 시간이 경기 종료 시간을 지났을 때 경기 상태를 모집 마감 -> 경기 종료로 변경

기존 방식

  • 경기 시작 시간은 30분 간격으로만 생성할 수 있었고, 경기 진행 시간도 30분 간격으로 설정할 수 있었기 때문에 30분 간격으로 스케줄링과 배치를 이용하여 DB에서 모든 레코드를 조회하고 조건에 맞는 경기들의 경기 상태를 변경

기존 방식의 문제점

  • 경기의 데이터가 많지 않기 때문에 대규모의 데이터를 처리하는 배치와는 어울리지 않다고 생각 함
  • 배치를 이용하기 위한 학습 러닝 커브가 존재
  • 배치 처리 된 결과와 수동 처리를 위한 별도의 젠킨스 서버 구축 비용
  • 경기는 각각의 사용자들이 개별적으로 생성하는 것인데 배치를 이용해서 한 꺼번에 처리한다는 것이 부자연스러움
  • DB 테이블 풀 스캔으로 인한 성능 저하

새로운 방식

  • Redis Keyspace Notification을 이용한 이벤트 처리

동작 방식

  1. 경기를 생성할 때 Redis에 아래와 같은 방식으로 키 저장

    • Game:CLOSED:1 -> 1번 id를 가진 게임의 경기 상태를 CLOSED(모집 중-> 모집 마감)로 변경
    • Game:ENDED:2 -> 2번 id를 가진 게임의 경기 상태를 ENDED(모집 중 -> 모집 마감)로 변경
    • Redis에 키 값을 저장할 때 경기를 생성했던 시간과 경기 시작 또는 경기 종료 시간의 차를 구하여 TTL로 설정
  2. 저장했던 키의 시간이 만료되면 Spring으로 키 만료 이벤트를 발생시킴

    • Redis가 pub, Spring이 sub이 되는 형태
  3. 키 만료 이벤트를 확인하여 게임 상태를 변경하는 Key가 맞을 경우 DB에서 해당 레코드를 불러와 수정

    • Key를 확인해야하는 이유는 Redis의 키 만료 이벤트는 특정 키에 대해서만 이벤트를 받을 수 있지는 않아서 모든 키가 만료되면 Spring으로 이벤트를 발생시킴

새로운 방식의 장점

  • 배치 처럼 특정 시간마다 DB 테이블 풀 스캔을 해서 일일이 수정해야하는 요소들을 찾지 않고 경기를 생성할 때 해당 요소만 이벤트 처리하면 됨
  • 많은 학습이 필요하지 않고 기능이 단순하여 빠르게 구현할 수 있음

새로운 방식의 단점

  • 모든 키에 대한 만료 이벤트를 받기 때문에 Redis에 저장하는 키가 많아질 경우 Spring 서버로 불 필요한 요청이 생길 수 있음
    • 프로젝트 내에서 Redis에 저장하는 키가 많지 않아서 채택
    • Redis 서버 또는 채널을 분리하여 해결할 수 있음
  • 배치는 실패에 대한 처리와 젠킨스와 슬랙을 연동하여 처리에 관련된 메세지를 받을 수 있으나 새로운 방식은 직접 모두 구현해야하는 불편함이 있음

✅ 작업 목록

  • Redis 설정(Redis Pub, Spring Sub 구조)
  • 키 만료시 경기 상태를 변경하는 로직 구현

🙏 리뷰어에게


기타


Prefix

PR 코멘트를 작성할 때 항상 Prefix를 붙여주세요.

  • P1: 꼭 반영해주세요 (Request changes)
  • P2: 적극적으로 고려해주세요 (Request changes)
  • P3: 웬만하면 반영해 주세요 (Comment)
  • P4: 반영해도 좋고 넘어가도 좋습니다 (Approve)
  • P5: 그냥 사소한 의견입니다 (Approve)

@Hchanghyeon Hchanghyeon added 신규 기능 [feat] 새로운 기능을 추가한다. 리팩토링 [refactor] 실행 결과는 동일하고, 코드 구조만 변경한다. labels Jan 19, 2024
@Hchanghyeon Hchanghyeon self-assigned this Jan 19, 2024
Copy link

@Hchanghyeon Hchanghyeon merged commit 1eb36d7 into dev Jan 20, 2024
2 checks passed
@Hchanghyeon Hchanghyeon deleted the feature/#277 branch January 20, 2024 03:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
리팩토링 [refactor] 실행 결과는 동일하고, 코드 구조만 변경한다. 신규 기능 [feat] 새로운 기능을 추가한다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[게스트 모집] 경기 상태 변경 배치에서 Redis Expire Event로 변경 작업
2 participants