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 로 추가 작업을 진행한다.

구독 처리에 대한 케이스

  • 케이스
      1. 글을 작성할 당시의 Group 의 구독자들에게만 Feed 함을 추가해 주는 방법
      1. 1번 케이스 외에도 Group 에 구독을 추가할 때, Feed 에 기존 글들을 추가하는 방법
  • 위 케이스외에도 여러 방법이 있겠지만, 그건 기획 스팩에 따라 달라질 것 같다.
  • Feed 에 대한 이벤트를 다양하게 받을 수 있게 구현한다면 대부분 처리 가능하다.

Feed 에 대한 글 제공

  • Feed 목록에 대해서 페이지를 구성하기 위해서는 2가지 조회가 필요하다.
  • Feed 에서 특정 유저 기반으로 index 데이터를 조회하고, 그 contentId 를 랜덤 엑세스로 N 건 DB 에서 데이터를 조회하여 목록을 제공한다.
  • 단, 페이징 처리에 대해서는 offset base 로 처리하는 것이 아니라 cursor base 로 처리해야함.

글 삭제처리 외 상태 변경에 따른 노출 컨트롤

  • 예상하고 있는 방법은 아래와 같다.
    • Content Table 에서 글을 제거한다.
      • Hard Delete 와 같이 row 를 제거할 수도 있고
      • Soft Delete 로 statue 를 Delete 로 변경하여 노출에서 제거 할 수 있다.
    • Feed 테이블에서 해당 글을 구독한 사용자들에게 Delete 를 한다.
      • ??????????????
  • 구독한 사용자를 글을 쓴 시점에 또는 이후 추가된 사용자들 목록까지 전부 알아내는데는 큰 비용이 든다.
    • 인덱스 구조상 반대로 된 인덱스를 구현해야해서, 저장공간을 추가로 사용해야한다.
    • 또 목록을 찾아가며 제거해야하므로, 조회에 대한 부하도 생긴다.
  • 대안

글에 대한 제거만 진행하고, 랜덤엑세스에 대한 조회에서 없을 경우 노출을 안시키는 등으로 대응

글 제거만 처리했을 때 발생되는 이슈

목록이 비어나오는 경우

  • 1회 목록 조회시에 Feed 목록에 대해서 컨텐츠들이 모두 글 삭제 상태일 수 있다.
    • 이럴 경우, 1회 조회시에 n * m 개 형태로 더 조회한다.
      • 예시) 1회 조회시 10개를 노출 목표로 할 경우, 1.2배하여 12개를 조회한다.
    • 조회에 대해서 노출할 내용이 비어있을 경우, 다시 Feed 를 조회한다.
      • 만약 해당처리가 병목이 될 수 있으므로, 연동하는 측에서 Retry 할 수 있도록 논의하는 것도 방법이다.

제거된 글이 너무 많을 경우…

  • Feed Publish 할 때 feed 에 대한 데이터를 영속성있게 가지고 가는 것보다, ttl 등을 적용하여 지속적으로 제거 될 수 있도록 한다.
    • feed 목록이 빌 수 있으므로 추가 대응이 필요하다.
    • 예시) feed 는 100일간만 노출한다.

결론

  • Content, Feed 등 도메인을 잘 나눠서 개발이 필요하다.
    • 이벤트도 잘 나뉘어 있어야한다.
  • Content Table 에 대해서 상태값을 컨트롤 해서 Feed 목록을 처리한다.

Related Posts