# 뉴스 피드 시스템

### API 설계

```
POST /v1/me/feed        # 피드 밠행
@ Authorization Header
@ Body

GET /v1/me/feed         # 뉴스 피드 생성
@Authorization header
```

### 피드 발행 (뉴스 만들기)

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134413_G7o00hSVM7yHWd8WAY?q=80&s=1280x180&t=outside&f=webp)

### 뉴스 피드 생성 (뉴스 읽기)

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134414_CQgSVdTim4dZiqZzZj?q=80&s=1280x180&t=outside&f=webp)

## 상세 설계

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134414_t0ZN88H74hjufrLDdO?q=80&s=1280x180&t=outside&f=webp)

### 웹 서버

- 인증, 처리율 제한 등을 수행하는 API Gateway이다.

- 대부분 클라이언트와 API Gateway 사이에는 HTTPS를, 나머지 내부 시스템은 HTTP 통신을 사용한다.

### 포스팅 전송(팬아웃 서비스)

- 새 포스팅을 친구들에게 전파하는 과정

- Push 모델과 pull 모델이 있다.

**Push model(fanout-on-write)**

- 포스팅이 등록되자마자 친구들에게 전송되기 때문에 피드 갱신 시간이 짧다.

- 하지만 친구 목록을 가져오는데 시간이 많이 들고(hotkey), 

- 서비스를 자주 사용하지 않는 사용자까지 매번 업데이트해야 하기 때문에 불필요한 비용이 발생한다.

**Pull model(fanout-on-read)**

- 사용자가 읽기를 요청할 때 가져오는 온디멘드 방식이다. 

- hotkey 문제가 없고 비활성 유저를 챙길 필요도 없다.

- 하지만 피드가 올라올 때까지 시간이 걸리기 때문에 유저가 싫어할 수 있다.

### 팬아웃 절충안

- 대부분 사용자는 push 모델을 사용하고, 친구가 많은 사용자에 한해 pull 모델을 사용한다.

- 안정 해시를 통해 부하를 분산해 hotkey 문제를 해결한다.

- 캐시의 경우 <user_id, post_id> 매핑 테이블로 만들고 유저당 최신 100개 피드 같은 정책을 사용해 용량 낭비를 줄인다.

- post_id를 서버에서 가져오면, 실제 post는 CDN을 통해서 가져온다. 이렇게 하면 서버 자체의 부하를 엄청 줄일 수 있다.

###  캐시 구조

- 뉴스 피드 : 뉴스 피드

- 콘텐츠 : 인기 콘텐츠, 일반 콘테츠

- 소셜 그래프 : 팔로워, 팔로잉

- 행동 : 좋아요, 답급, 기타

- 횟수 : 좋아요 회수 답글 횟수, 기타

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
