트위터, 페이스북, 인스타그램 등 SNS에서 팔로워들의 게시물을 보여주는 피드
Cursor
기반 페이지네이션을 이용하여 포스트 조회 코드
public List<Post> findAllByInMemberIdAndOrderByIdDesc(List<Long> memberIds, int size) {
// memberIds가 비었을 경우 빈 리스트 반환
if (memberIds.isEmpty()) {
return List.of();
}
var sql = """
SELECT *
FROM Post
WHERE memberId in (:memberIds)
ORDER BY id desc
LIMIT :size
""";
var params = new MapSqlParameterSource()
.addValue("memberIds", memberIds)
.addValue("size", size);
return namedParameterJdbcTemplate.query(sql, params, POST_ROW_MAPPER);
}
지금까지의 방법은 **Fan Out On Read (Pull Model)**
이다. 이 방법은 조회 시점에 부하가 발생하게 된다.
위와 같은 방법으로 팔로우한 회원들의 포스트를 조회할 경우의 시간 복잡도를 알아보자
시간 복잡도 =
log(follow 전체 레코드) + 해당 회원의 Following * log(Post 전체 레코드)
따라서, 위와 같은 방법의 경우 열심히 팔로우 하고 활동하는 회원일 수록 서비스의 질이 떨어지는 현상을 맞이하게 된다.
Write 시점에 Fan out을 하는 부하가 발생하는 모델에 대해서 알아보겠습니다.
해당 모델은 게시물 작성시, 해당 회원을 팔로우하는 회원들에게 데이터를 배달합니다.
Insert
해준다.Pull 모델
에서의 조회 시점의 부하를 쓰기 시점의 부하로 치환Facebook
은 Pull 모델
, 트위터
는 Pull 모델
을 이용하는 만큼 각각의 장단점이 있다.Push Model
(Write 부하)은 공간복잡도를 희생
Pull Model
(Read 부하)은 시간 복잡도를 희생
Pull Model
은 원본 데이터를 직접 참조하므로 정합성에 이점이 있으나 Follow 수가 많은 회원일수록 처리 속도가 느려진다.
Push Model
에서는 게시물 작성과 타임라인 배달의 정합성 보장에 대한 고민이 필요하다
상황, 자원 정책 등 여러가지를 고려해 트레이드 오프 해야한다.
CAP 이론이란
분산 데이터베이스 시스템은 분할이 생겼을 때 일관성과 가용성 중 하나를 희생하야 한다는 뜻이다. 분산 데이터베이스 시스템은 네트워크 장애나 다른 이슈들에 대처하기 위해서 분할 허용성이 반드시 필요하다. 이로인해 일관성과 가용성 중 하나를 포기해야 할 수 있다.