본문 바로가기
project/Photogram

Photogram Push 기반 피드 구현

by setung 2025. 4. 14.

Photogram에서는 사용자의 팔로우 기반 피드를 Push 방식으로 구성했다.

즉, 게시글이 업로드되면 해당 게시글 정보를 팔로워들의 피드에 즉시 푸시하는 방식이다.

 

 

user post follow ERD

 

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)

전체 흐름 요약

  1. 클라이언트가 게시글 업로드 요청을 보낸다.
  2. post-service는 게시글을 DB에 저장한 뒤, 게시글 업로드 이벤트를 Kafka로 발행한다.
    event_payload : { postId, writerId }
  3. feed-service는 Kafka에서 해당 업로드 이벤트를 pull(구독) 한다.
  4. 이벤트를 가져온 feed-service는 writerId를 기반으로 user-service에 팔로워 목록을 요청한다.
  5. 받아온 팔로워 목록을 순회하며, 각 유저의 피드 정보(Redis, Sorted Set)에 업로드된 게시글 ID를 저장한다.
  6. 사용자가 피드를 조회할 때, Redis에 저장된 게시글 ID를 통해 빠르게 가져올 수 있게 된다.

게시글 업로드 외의 유저 삭제, 팔로우 취소, 게시글 삭제 등도 Kafka 이벤트 처리 방식으로 피드 반영했다.

 

보안할 점

push 방식은 인플루언서와 같이 팔로워가 많다면 불리한 방식이다. 예로 1억 명 팔로워가 있는 유저가 게시글을 올리면 1억 번 push가 발생한다.

이 같은 경우는 피드 요청이 왔을 때 처리하는 pull 방식으로 처리하는게 유리하다.

pull 방식을 어떻게 push와 결합할지는 현재 고민중이다.

 

 

 

댓글