내용
주요 기능: 새로운 소식 올리기 (피드 발행) , 팔로우 한 사람들의 소식 보기 (피드 생성)
피드 발행: 캐시&db에 기록, 나를 팔로우 하는 사람들의 피드에 전송
피드 생성: 내가 팔로우 하는 사람들의 피드를 모아 최신순 정렬
설계
feed db: {
피드 고유 id : objectId
유저 고유 id (로그인한 사람 말고 작성자) : number -> userPreview로 변경
작성된 시각 : Date
피드 타입 : enumType
각 피드에 맞는 글: 각 피드에 맞는 타입
}
// id까지만 한 collection에 두고 feed collection을 따로 두는 설계를 고민했지만... sql공부 중에 비슷한 컬럼끼리 한 테이블에 모아두라 해서 모아둠
feed cache: (Map자료구조)
key: 유저 id
value: 피드 고유 id의 배열
ex) Map<81730, [(81730이 팔로우 하는 사람이 적은 글1), ...]>
cache 방식 2가지
fanout-on-write
포스팅 시 뉴스피드(모든 피드)를 갱신
본인의 캐시에 해당 포스팅을 기록
뉴스피드가 갱신되어있어 (pre-computed) read시 빠름
팔로워가 많은 사용자는 모두(접속하지 않는 유저도) 갱신해줘야해서 오래 걸림 (hotkey)
fanout-on-read
피드를 읽으려 할 때 갱신 (요청기반 on-demand)
비활성화 사용자가 많은 경우 로그인 전까지 자원 소모 x
hotkey x
피드 읽기까지의 소요시간이 길어질 수 있음
+) 두 방법을 적절히 섞어 장점을 얻을 수 있지만, fanout-on-write 방식을 우선적으로 구현 완료하고 마칠 예정의 이슈
API
GET
캐시의 userId와 feedId를 통해 userPreview와 게시글을 가져와 반환
(그럼 게시글도 preloadCache를 해야하는게...맞나)
- feedCache에서 내 userId을 통해 (key) 내가 팔로우하는 사람들의 피드id를 받음 (value)
- 피드 id를 통해 feed를 가져옴
- 반환
POST
cache와 db에 업데이트
- 내가 새 소식을 포스팅 함
- 나를 팔로우 하는 유저들의 id를 userCache에서 가져옴
- (나를 팔로우 했지만 mute한 유저 filter)
- feedCache에서 id를 키값으로 새로 쓴 포스팅 id를 push 해줌
get, post 둘 다 Authorization header 필요
240303
- 설계 고민 및 위 이슈 작성
- 코드로 구조 맞춰보기...
240308
- cursor paginated 추가
- union type을 paginated할 수 없던 이슈
- local에 cache가 있는 follow 먼저 만들기 시작
240309
- temp_follow 데이터 만든 후 follow feed 테스트
- get 틀 구현
- cache Map으로 구현
- post 틀 구현
- follow이외의 피드 이어서 작업...
- 작업 도중 cache를 바꾸게 될 수도 있음...
- db참조를 덜 하는 방향으로 가려 함...
내용
주요 기능: 새로운 소식 올리기 (피드 발행) , 팔로우 한 사람들의 소식 보기 (피드 생성)
피드 발행: 캐시&db에 기록, 나를 팔로우 하는 사람들의 피드에 전송
피드 생성: 내가 팔로우 하는 사람들의 피드를 모아 최신순 정렬
설계
feed db: {
피드 고유 id : objectId
유저 고유 id (로그인한 사람 말고 작성자) : number -> userPreview로 변경
작성된 시각 : Date
피드 타입 : enumType
각 피드에 맞는 글: 각 피드에 맞는 타입
}
// id까지만 한 collection에 두고 feed collection을 따로 두는 설계를 고민했지만... sql공부 중에 비슷한 컬럼끼리 한 테이블에 모아두라 해서 모아둠
feed cache: (Map자료구조)
key: 유저 id
value: 피드 고유 id의 배열
ex) Map<81730, [(81730이 팔로우 하는 사람이 적은 글1), ...]>
cache 방식 2가지
fanout-on-write
포스팅 시 뉴스피드(모든 피드)를 갱신
본인의 캐시에 해당 포스팅을 기록
뉴스피드가 갱신되어있어 (pre-computed) read시 빠름
팔로워가 많은 사용자는 모두(접속하지 않는 유저도) 갱신해줘야해서 오래 걸림 (hotkey)
fanout-on-read
피드를 읽으려 할 때 갱신 (요청기반 on-demand)
비활성화 사용자가 많은 경우 로그인 전까지 자원 소모 x
hotkey x
피드 읽기까지의 소요시간이 길어질 수 있음
+) 두 방법을 적절히 섞어 장점을 얻을 수 있지만,
fanout-on-write방식을 우선적으로 구현 완료하고 마칠 예정의 이슈API
GET
캐시의 userId와 feedId를 통해 userPreview와 게시글을 가져와 반환
(그럼 게시글도 preloadCache를 해야하는게...맞나)
POST
cache와 db에 업데이트
get, post 둘 다 Authorization header 필요
240303
240308
240309