Skip to content

f-lab-edu/outstagram

Repository files navigation

outstagram

instagram을 모티브로 만든 SNS API 서버 프로젝트


🌍 서버 아키텍처

image




📌 단순한 SNS API만 개발하지 않았습니다!

💥 피드 구성 및 푸시 알림 구현을 위한 비동기 처리 구현

  • 각 유저의 피드 목록은 Redis, Kafka를 활용한 비동기 방식으로 push model 구현

  • 푸시 알림도 Kafka를 활용한 비동기 처리


💥 동시에 여러 유저가 좋아요 눌렀을 때 발생할 수 있는 Race Condition은 어떻게 해결하는지

  • 각종 DB Lock 조사 후, 상황에 맞는 Lock 적용

  • Redis에서도 발생할 수 있는 Race Condition 문제를 Lua Script를 통해 Atomic하게 처리


💥 분산 DB 구현 및 분산 DB에서 커서 기반 페이지네이션을 어떻게 구현하는지

  • 분산 환경에서 ID로 정렬하기 위해서 Snowflake ID 구현

  • 애플리케이션 레벨에서 DB sharding 로직 구현 (동적으로 DB Source 변경하기)


💥 객체 지향적으로 어떻게 설계하는지

  • 각종 추상화 및 AOP 도입 (ImageService 추상화, 세션에 유저 정보 가져오기 위한 AOP 등)

  • 템플릿 메서드 패턴과 같은 디자인 패턴 도입


💥 부하 테스트 툴(nGrinder) & APM 툴(pinpoint) 활용해 리팩토링 전후 성능 비교

  • 캐시 유무로 인한 성능 비교

  • 부하 테스트 후, pinpoint로 call stack 확인해 병목 지점 파악 후, 개선하기




🤦‍♂️🤷‍♂️ 프로젝트 중 고민한 이슈와 해결 방법

  1. AOP를 통한 cross-cutting concern 걷어내기

  2. 동시성 문제 고민 및 해결방안

  3. 이미지 처리1 - 추상화

  4. 간단한 DB 쿼리 리팩토링

  5. 무한 스크롤 도입 ~ Snowflake 도입까지 과정

  6. kafka를 활용한 피드 push model 구현 과정

  7. 같은 클래스에서 @Cacheable 달린 메서드 호출하면 왜 안 적용될까...

  8. 이미지 처리2 - 템플릿 메서드 패턴 적용

  9. lua script를 통한 Redis 동시성 이슈 해결

  10. nGrinder를 활용해 부하 테스트 후 성능 튜닝

  11. nGrinder를 활용해 캐시 유무로 인한 성능 비교

  12. kafka 메시지 큐를 활용해 비동기 메시지 전송을 도입한 이유

  13. nGrinder & pinpoint로 병목 지점 파악 후, sharding을 통해 성능 개선한 경험

  14. AOP 활용해 동적으로 DB Source 바꾸기




🖥 프로토타입

  • 카카오 오븐을 활용해 간단한 프로토타입 제작

프로토타입 전체




🔨 기능 구현 및 API 시그니처 정의




🧱 ERD 설계

drawSQL-image-export-2024-05-04

About

instagram과 같은 SNS 서비스

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages