Feed System 에서 Content 삭제에 대한 처리 고민.
Feed System 구성
- Content 는 특정 Group 하위에 여러 Content 를 가질 수 있는 구조로 되어있다.
- Content 를 제공하고 있는 테이블이 있고, Feed 를 제공하기 위한 Index 용 테이블이 있다.
- Group 에 대한 구독을 하고 있는 유저들 목록을 제공하고 있는 테이블이 있다.
Content table
- 간단하게 아래와 같은 테이블이 구성되어있다고 하자. ```
- contentId : 글 번호
- group : 글의 상위 그룹
- title : 글 제목
- content : 글 내용
- status : 글 상태 ```
Group 구독 table
- contentGroup : 글의 상위 그룹
- userId: 유저 아이디
Feed table
- userId : 유저 아이디
- contentId : 글 번호
Feed Publish(Fan Out)
- 글 작성시에 Event 를 발생시키고, 해당 이벤트를 받은 뒤에 해당 글의
Group
을 구독하고 있는 유저들Feed
에 ContentId 로 추가 작업을 진행한다.
구독 처리에 대한 케이스
- 케이스
-
- 글을 작성할 당시의
Group
의 구독자들에게만Feed
함을 추가해 주는 방법
- 글을 작성할 당시의
-
- 1번 케이스 외에도
Group
에 구독을 추가할 때,Feed
에 기존 글들을 추가하는 방법
- 1번 케이스 외에도
-
- 위 케이스외에도 여러 방법이 있겠지만, 그건 기획 스팩에 따라 달라질 것 같다.
- Feed 에 대한 이벤트를 다양하게 받을 수 있게 구현한다면 대부분 처리 가능하다.
Feed 에 대한 글 제공
Feed
목록에 대해서 페이지를 구성하기 위해서는 2가지 조회가 필요하다.Feed
에서 특정 유저 기반으로 index 데이터를 조회하고, 그contentId
를 랜덤 엑세스로 N 건 DB 에서 데이터를 조회하여 목록을 제공한다.- 단, 페이징 처리에 대해서는 offset base 로 처리하는 것이 아니라 cursor base 로 처리해야함.
글 삭제처리 외 상태 변경에 따른 노출 컨트롤
- 예상하고 있는 방법은 아래와 같다.
- Content Table 에서 글을 제거한다.
- Hard Delete 와 같이 row 를 제거할 수도 있고
- Soft Delete 로 statue 를 Delete 로 변경하여 노출에서 제거 할 수 있다.
- Feed 테이블에서 해당 글을 구독한 사용자들에게 Delete 를 한다.
- ??????????????
- Content Table 에서 글을 제거한다.
- 구독한 사용자를 글을 쓴 시점에 또는 이후 추가된 사용자들 목록까지 전부 알아내는데는 큰 비용이 든다.
- 인덱스 구조상 반대로 된 인덱스를 구현해야해서, 저장공간을 추가로 사용해야한다.
- 또 목록을 찾아가며 제거해야하므로, 조회에 대한 부하도 생긴다.
- 대안
글에 대한 제거만 진행하고, 랜덤엑세스에 대한 조회에서 없을 경우 노출을 안시키는 등으로 대응
글 제거만 처리했을 때 발생되는 이슈
목록이 비어나오는 경우
- 1회 목록 조회시에 Feed 목록에 대해서 컨텐츠들이 모두 글 삭제 상태일 수 있다.
- 이럴 경우, 1회 조회시에 n * m 개 형태로 더 조회한다.
- 예시) 1회 조회시 10개를 노출 목표로 할 경우, 1.2배하여 12개를 조회한다.
- 조회에 대해서 노출할 내용이 비어있을 경우, 다시 Feed 를 조회한다.
- 만약 해당처리가 병목이 될 수 있으므로, 연동하는 측에서 Retry 할 수 있도록 논의하는 것도 방법이다.
- 이럴 경우, 1회 조회시에 n * m 개 형태로 더 조회한다.
제거된 글이 너무 많을 경우…
- Feed Publish 할 때 feed 에 대한 데이터를 영속성있게 가지고 가는 것보다, ttl 등을 적용하여 지속적으로 제거 될 수 있도록 한다.
- feed 목록이 빌 수 있으므로 추가 대응이 필요하다.
- 예시) feed 는 100일간만 노출한다.
결론
- Content, Feed 등 도메인을 잘 나눠서 개발이 필요하다.
- 이벤트도 잘 나뉘어 있어야한다.
- Content Table 에 대해서 상태값을 컨트롤 해서 Feed 목록을 처리한다.