조회수 어뷰징 방지 질문
안녕하세요~
어뷰징 방지에 대한 질문을 드리고 싶습니다.
현재, 어뷰징 방지를 위해 분산락을 잡고 해당 유저가 특정 게시물에 대한 조회수를 10분 동안 1만 올릴 수 있도록 설계해주셨는데요.
레디스의 키-벨류 로도 충분히 위와 같은 어뷰징 방지를 설계할 수 있지 않나요?
SETNX (key=유저+게시글, value=1, TTL=10분)
만약 이 값이 이미 존재한다면 조회수를 올리지 않는 방식으로 구현해도 충분할 거 같은데, 분산락으로 이 로직을 구현하신 이유가 궁금합니다.
감사합니다!
답변 2
0
amoa님, 안녕하세요!
만약 이 값이 이미 존재한다면 조회수를 올리지 않는 방식으로 구현해도 충분할 거 같은데, 분산락으로 이 로직을 구현하신 이유가 궁금합니다.
강의에서 진행한 setIfAbsent가 내부적으로 SETNX 명령어를 사용하기 때문에 동일한 방식입니다.
두 가지가 다른 방식이 아닙니다.
분산락에 대한 구현 방식을 SETNX로 처리했다고 봐주시면 됩니다!
0
안녕하세요, 인프런 AI 인턴입니다. amoa님.
어뷰징 방지 정책을 설계할 때, 특히 조회수 증가와 관련된 로직에서 분산락을 사용하는 이유와 Redis의 키-값 쌍을 활용하는 방법에 대해 자세히 설명해드릴게요.
Redis를 활용한 어뷰징 방지 방법
Redis의 키-값을 활용한 방법:
SETNX명령과TTL을 사용하여 특정 사용자가 일정 시간 동안 특정 글에 대해 조회수를 한 번만 증가시키도록 할 수 있습니다. 예를 들어,SETNX (key=유저+게시글, value=1, TTL=10분)으로 설정하면 최초 접속 시에만 값이 설정되고, TTL이 지나기 전까지는 동일한 키 생성이 방지됩니다.
분산락을 사용하는 이유:
- 데이터 일관성 및 충돌 방지: 분산락은 여러 서버나 인스턴스에서 동시에 같은 작업이 실행되지 않도록 보장합니다. 특정 사용자가 여러 분산 환경(예: 다양한 서버, 클라우드 인스턴스)에서 동시에 접근할 때 발생할 수 있는 동시성 문제를 해결하는데 유효합니다.
- 복잡한 트랜잭션 관리: 분산락은 더 복잡한 트랜잭션 구조에서 데이터의 원자성을 보장하는데 유리합니다. 즉, 여러 데이터를 동시에 변경해야 하는 상황에서는 분산락이 큰 도움이 됩니다.
- 데이터 일관성 및 충돌 방지: 분산락은 여러 서버나 인스턴스에서 동시에 같은 작업이 실행되지 않도록 보장합니다. 특정 사용자가 여러 분산 환경(예: 다양한 서버, 클라우드 인스턴스)에서 동시에 접근할 때 발생할 수 있는 동시성 문제를 해결하는데 유효합니다.
결론
- Redis의
SETNX와TTL을 활용하여 간단히 어뷰징을 방지할 수 있지만, 분산 환경에서의 동시성 문제나 복잡한 트랜잭션 관리가 필요할 때는 분산락을 병행하는 것이 데이터의 일관성을 유지하는 데 더 효과적일 수 있습니다.
완벽한 해결책은 아니지만, 환경에 맞게 적절한 해결책을 찾아가는 것이 중요합니다. 유사한 주제를 다룬 게시글이 있으면 참조하실 수 있도록 안내해 드리겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
@Version 어노테이션이 붙은 필드는 낙관적 락이든 비관적 락이든 업데이트가 됩니다.
0
31
1
consumer에서 에러가 발생할 경우 데이터 유실 문의
0
47
2
게시글 테스트 데이터 삽입
0
50
2
정렬, 필터, 검색 등의 조건이 붙을 경우 최적화할 수 있는 방법이 무엇이 있을까요?
0
104
2
좋아요 기능 정합성 보장 방법
0
97
2
좋아요 동시성처리 최적의 선택?
1
135
2
프론트엔드 msa 환경 api 주소 통합? 과 서버끼리 통신 방식에대해
0
92
2
안녕하세요 무한스크롤 강의듣다가 질문이 있습니다.
0
59
1
조회수 조회 로직 질문
1
67
2
비로그인 유저도 어뷰징 방지 정책
1
72
2
CommentServiceTest의 테스트 로직 질문
0
54
2
무한 스크롤 방식에서 페이지 번호 방식 쿼리의 문제점 의문
1
74
2
path 쿼리 관련 질문드립니다!
0
60
2
antigravity 에디터를 쓰신다면 종료해주세요
1
123
0
프로젝트 구조
0
88
2
article_like_count api test
0
78
2
이벤트 페이로드 객체의 생성 방식이 팩토리 메서드 패턴이 아닌 빌더 패턴인 이유가 궁금합니다!.
0
104
2
[33. 좋아요 수 구현] 에서 테스트 하는 화면 동시성 문제
0
91
2
findByPath에서 articleId로도 검색을 해야 할 것 같아요.
0
92
3
jpa ddl-auto none을 하는 이유와 join 방법
0
97
2
팩터리 메소드와 response 객체 사용 이유가 궁금합니다!
0
90
2
커서 기반 페이지네이션 과 무한 스크롤링
0
110
2
게시글 생성 로직에서 오류 발생시 redis 게시글 수 되돌리기
0
97
2
멀티 모듈이 아닌 MSA 환경에서 common
0
156
2





