프로젝트(12)
-
[프로젝트] 캐시를 통한 좋아요, 팔로우 로직 최적화
Flickr(플리커) 프로젝트 개발 중 Redis 캐시를 사용해 다음 로직을 구현했습니다. 1. 피드 좋아요 누르기, 해제하기 위 사진처럼 어떤 게시글에 하트를 누름으로써 좋아요 누름/해제 기능이 일어납니다.주의 사항 : 사용자는 게시글 좋아요를 단시간동안 여러 번 클릭할 수 있음하트를 누르는 것만으로 체크/해제가 발생함좋아요 로직은 사용자가 빠른 시간에 파바박 클릭할 수 있어, 짧은 시간에 많은 요청이 들어올 수 있습니다. 이런 경우 프런트단에서 디바운싱, 쓰로틀링을 통해 막아줄 수 있다고 합니다. 저는 쓰로틀링 기법을 사용했습니다. 디바운스(Debounce)연속적으로 발생하는 이벤트를 제어하며, 일정 시간 동안 이벤트가 발생하지 않을 때 마지막 이벤트만을 처리하는 방법입력이 멈춘 후, 일정 시간 동..
2024.08.10 -
[프로젝트] Pagination 으로 피드 랜덤조회 개선
Flickr(플리커) 개인 프로젝트 개발 중에, k6을 이용해 부하 테스트를 해보고 성능 개선 경험을 적어보려고 한다. k6란?오픈 소스 성능 테스트 툴로, 쉽고 간편하게 스크립트를 작성하고, 테스트 해볼 수 있음성능이 뛰어나고 테스트가 간편해 채택하였다.MAC 에서 k6 설치brew install k6 위 명령어로 새로운 script.js 스크립트 파일을 생성해, 테스트를 수행할 수 있다. 플리커 홈 화면 홈에서 새로고침을 할 때마다 전체 피드중에서 랜덤하게 15개를 골라 출력한다.즉 랜덤한 피드(게시글) 15개를 가져오는 로직이 이 서비스의 핵심 기능 중 하나라고 볼 수 있다. 상황 : user 데이터 1000개, feed(게시글) 데이터 10만개라고 가정하고, 부하 테스트를 진행해보자.사진과 같..
2024.08.08 -
[프로젝트] 레디스 Pub/Sub, RabbitMQ 도입으로 구조 개선
노닥 노닥 프로젝트 개발 중에,게시글 작성 시, 작성한 사람의 팔로워들에게 실시간으로 알림 전송누가 자신을 팔로우하면, 알림 전송일주일 치 알림 정보를 저장하고 있어야 함위 알림 기능을 SSE(Sever Sent Events), Redis 로 구현했었다. 관련 포스팅 : https://matt1235.tistory.com/80 클라이언트가 서버에게 subscribe 요청을 보내 SSE 연결을 맺은 후에, 이벤트가 발생 시 서버 -> 클라이언트로메시지를 실시간으로 보내주었다. SSE 연결, 알림 시퀀스 다이어그램 위 그림을 보면 Redis sorted_set 에서 1주일 치 게시글 가져오기 부분이 있다.해당 기능은 timestamp 로 score 를 부여했기에 rangeByScore 쿼리로 현재 ~ 과..
2024.06.18 -
[프로젝트] SSE 로 실시간 알림 기능 구현하기
노닥 노닥 프로젝트 개발 중에,팔로우 한 사용자가 새 게시글을 작성한 경우 팔로워에게 실시간으로 알림 전송알림은 최소 1주일 치의 정보를 가지고 있어야 함 (접속하지 않은 경우에도 알림은 쌓여야 한다.)위 상황에서 알림을 보내는 기능이 필요했다. 대표적으로 Polling, 웹 소켓, SSE 방식을 생각해 볼 수 있는데 폴링은 리소스 낭비가 심할 것 같았고,웹 소켓처럼 양 방향 통신이 필요한 것도 아니었기에, SSE 를 선택했다. (SSE 관련 자세한 내용 설명은 생략합니다.)관련 포스팅 : https://matt1235.tistory.com/79 웹 소켓 & SSE(Server Sent Events)웹 소켓과 SSE를 알아보기 전, 우선 클라이언트와 서버 간의 HTTP 통신에 대해 알아봅시다. HTTP..
2024.06.13 -
[쿠폰] 서버 모니터링 및 부하테스트
https://github.com/Jungsu-lilly/Coupon-Service/issues/13 서버 모니터링 및 배포 · Issue #13 · Jungsu-lilly/Coupon-ServiceDescription 📝 Grafana로 서버 모니터링을 수행합니다. 실제 서비스를 배포하고 성능 테스트를 진행합니다. TODO ✅ grafana로 서버 모니터링 환경 구축 성능 테스트 수행github.com Prometheus + Grafana 를 사용해 서버 매트릭을 수집하고, 모니터링한 과정을 작성하려고 합니다. 실제 AWS 에 배포한 후 CloudWatch로 모니터링도 진행했습니다. 현재 프로젝트는 3가지 모듈로 구성되어 있습니다.coupon-api제일 앞단에서 API 요청을 받는 서버, 응답 또한 ..
2024.05.12 -
레디스 쿼리로 서버 RPS 개선
이전 포스팅에서 이어집니다 (:https://matt1235.tistory.com/73https://matt1235.tistory.com/74 Spring Boot + Redis 로 쿠폰 발급 요청을 적재하고, 발급 내역을 저장하는 서버를 구현했습니다.쿠폰 발급 요청이 들어왔을 때, 처리 순서는 다음과 같습니다. 1. 쿠폰 엔티티 캐싱@Cacheable 어노테이션을 통해 스프링에서 쿠폰 엔티티 조회 결과를 캐싱한다.단기간에 쿠폰 발급을 요청하는 트래픽이 몰릴 때, 캐싱으로 성능을 향상시킬 수 있다.@Service@RequiredArgsConstructorpublic class CouponCacheService { private final CouponIssueService couponIssueSe..
2024.04.29