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

refactor: 분산락 적용 #99

Merged
merged 20 commits into from
Nov 20, 2024
Merged

Conversation

kimyu0218
Copy link
Collaborator

@kimyu0218 kimyu0218 commented Nov 16, 2024

Issue Number

close: #96

작업 개요

기존에 사용한 RDBMS 락이 성능 저하의 우려가 있어 리뷰 내용을 바탕으로 분산락을 적용했습니다.

작업 사항

  • redisson 라이브러리를 사용하여 락을 획득/반환하고 있습니다.
  • 추후 다른 곳에서도 분산락을 사용할 수 있도록 직접 정의한 @RedissonLock 어노테이션을 포인트컷으로 AOP를 적용했습니다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedissonLock {
    String value() default "Unknown";

    long waitTime() default 5L;

    TimeUnit timeUnit() default TimeUnit.SECONDS;
}
  • 기존에 MissionMemberEventHandler에 작성한 푸시 알림 로직을 분리했습니다.

고민한 점들(필수 X)

분산락을 재사용할 수 있도록 로직을 작성하다보니 LockKey를 만드는 과정이 못생겼습니다 🥹
현재 락 키의 형식은 다음과 같습니다.

# LOCK:[TARGET]:[VALUE]
LOCK:MissionVerification:[CreateMissionVerification{missionId=0, memberId=0}]

Target은 인터셉트한 함수의 어노테이션 value값, VALUE는 인터셉트한 함수의 arg.toString()입니다.
조금 더 좋은 방법이 있을까요?

스크린샷(필수 X)

여기에 작성하세요

@kimyu0218 kimyu0218 requested a review from songyi00 as a code owner November 16, 2024 05:10
private final RedissonClient redissonClient;

@Around("@annotation(com.nexters.goalpanzi.common.annotation.RedissonLock)")
public void lockMissionVerification(final ProceedingJoinPoint joinPoint) throws Throwable {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

빠른 실행력.. 👍
나는 Key 만드는 방식 직관적이라 좋은 것 같은데 어느 부분이 고민이양?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드 반환 타입 Object 같은 최상위 클래스로 해줘도 좋을 것 같아
추후에 반환 타입있는 메서드에도 사용 가능하도록 ㅎㅎ

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

toString()으로 Object 싹다 직렬화하니까 key가 너무 길어지는 것 같아서! 괜찮으면 그냥 이대로 둘게!!

Copy link
Member

@songyi00 songyi00 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생했다 유정 🫡

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI 실패하는 건 해당 테스트에서 레디스 사용하는데 컨테이너 실행을 안해줘서 그런 것 같아
@ContextConfiguration(
initializers = {RedisInitializer.class}
) 이거 붙여줘볼랭?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@songyi00 옹 언니 덕분에 해결했다!!
근데 @SpringBootTest 붙은 모든 곳에 붙여줘야 정상적으로 동작해서 추후에 개선해봐야 할 것 같아 😢
auto configuration 때문에 spring.redisson.enabled=false를 해도 RedissonClient가 기본값으로 빈으로 등록되더라구
@EnableAutoConfiguration에서 exclude로 redisson 자동 구성 클래스를 제외해봤는데 redis가 또 redisson에 의존하고 있었어

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kimyu0218
이거 다른 통합 테스트는 AcceptanceTest 추상 클래스 상속하고 있어서 따로 추가안해줘도 되긴 하는데
통합 테스트가 아니고 레디스만 필요한 경우라면 어노테이션 따로 만들어도 좋을 것 같아용

@kimyu0218 kimyu0218 force-pushed the refactor/#96-distributed-lock branch from d1a3d40 to b99eef2 Compare November 19, 2024 00:10
@kimyu0218 kimyu0218 force-pushed the refactor/#96-distributed-lock branch from bb60f21 to 82aa997 Compare November 20, 2024 13:52
@kimyu0218 kimyu0218 merged commit c607486 into develop Nov 20, 2024
1 check passed
@kimyu0218 kimyu0218 deleted the refactor/#96-distributed-lock branch November 20, 2024 13:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

RDB락 분산락으로 교체
2 participants