Photogram에서는 사용자의 팔로우 기반 피드를 Push 방식으로 구성했다.
즉, 게시글이 업로드되면 해당 게시글 정보를 팔로워들의 피드에 즉시 푸시하는 방식이다.
ERD는 위와 같이 구성되어 있으며 쿼리로 충분히 feed를 구현할 수 있다.
SELECT p.*
FROM Post p
JOIN Follow f ON p.writer_id = f.target_id
WHERE f.requester_id = :userId AND f.status = 'ACCEPTED'
ORDER BY p.created_at DESC
LIMIT 20;
하지만 feed는 요청이 잦거나, follow가 많을수록 DB에 부하가 올 수 있다.
Push 기반 피드 생성 흐름 (with Kafka & Redis)
전체 흐름 요약
- 클라이언트가 게시글 업로드 요청을 보낸다.
- post-service는 게시글을 DB에 저장한 뒤, 게시글 업로드 이벤트를 Kafka로 발행한다.
event_payload : { postId, writerId } - feed-service는 Kafka에서 해당 업로드 이벤트를 pull(구독) 한다.
- 이벤트를 가져온 feed-service는 writerId를 기반으로 user-service에 팔로워 목록을 요청한다.
- 받아온 팔로워 목록을 순회하며, 각 유저의 피드 정보(Redis, Sorted Set)에 업로드된 게시글 ID를 저장한다.
- 사용자가 피드를 조회할 때, Redis에 저장된 게시글 ID를 통해 빠르게 가져올 수 있게 된다.
게시글 업로드 외의 유저 삭제, 팔로우 취소, 게시글 삭제 등도 Kafka 이벤트 처리 방식으로 피드 반영했다.
보안할 점
push 방식은 인플루언서와 같이 팔로워가 많다면 불리한 방식이다. 예로 1억 명 팔로워가 있는 유저가 게시글을 올리면 1억 번 push가 발생한다.
이 같은 경우는 피드 요청이 왔을 때 처리하는 pull 방식으로 처리하는게 유리하다.
pull 방식을 어떻게 push와 결합할지는 현재 고민중이다.
'project > Photogram' 카테고리의 다른 글
[Photogram] Redis + Resilience4j로 MSA 장애 전파 막기 (0) | 2025.04.23 |
---|---|
Photogram 태그 기반 게시글 검색 기능 (0) | 2025.04.13 |
Photogram 인증 구현하기 (1) | 2025.04.13 |
Photogram 아키텍처 (0) | 2025.04.13 |
댓글