[sns project] Post 뉴스피드 구현 (1)

Post 뉴스피드 구현 - 1

뉴스피드 : Facebook에서 팔로우 중인 사람들과 페이지, 그룹의 상태 업데이트, 사진, 동영상, 링크, 앱 활동, 좋아요 등의 소식이 끊임없이 업데이트되는 공간이다. 블로그

sns의 프로젝트의 꽃인 뉴스피드를 구현해야 한다. 지금까지 구현한 프로젝트에서 뉴스피드는 Post DB에 있는 모든 게시글을 가져온다. 이는 뉴스피드의 목적에 맞지 않고 data가 2000개가 넘어가는 순간 급격히 로딩되는 속도가 느려졌다.

이번 장에서는 뉴스피드를 구현하기 위한 삽질 일기를 써보려고 한다.

고민들..

처음 생각 - 내가 팔로우한 친구들의 게시글을 가져오자

첫 번째 개선방안으로 전체 게시글이 아닌 내가 팔로우한 친구들의 게시글을 가져올려 했다. 히지만 이 방법 또한 친구의 숫자와 게시글의 숫자가 늘어나면 속도의 문제가 발생할 것이다. 또한 이런 방법은 팔로우한 친구들의 지난 게시글도 지속적으로 가져온다는 단점이 있다.

다음 생각 - 팔로우한 친구들의 게시글을 큐나 스택에 저장하면 어떨까

그렇다면 팔로우한 친구들의 게시글을 큐나 스택 같은 자료구조에 저장하면 어떨까? 이것을 DB에 넣으면 수많은 쿼리가 발생하여 성능에 좋지 않을 것이다. 그래서 메시지 서비스 큐인 rabbitmq 를 사용해볼까 생각해보았다. rabbitmq는 책을 보고 따라 한 케이스밖에 없으므로 여러 블로그를 보면서 공부해보자.

RabbitMQ

MQ는 message q의 약자로 메시지 브로커라는 뜻이며, 전달받은 메시지를 전달하는 역할을 하는 소프트웨어이다.

RabbitMQ는 Producer가 Message를 Queue에 넣어두면, Consumer가 Message를 가져와 처리하는 방식이다.

AMQP

인스턴스가 데이터를 서로 교환할 때 사용하는 방법이다. MQ를 오픈 소스에 기반한 표준 프로토콜이 AMQP (Advanced Message Queuing Protocol) 이다. AMQP 자체가 프로토콜을 의미하기 때문에 이 프로토콜을 구현한 MQ 제품들은 여러가지가 있으며 그 중 하나가 RabbitMQ이다.

rabbitmq_arch

< RabbitMQ 시스템 구성도 >

언제 사용할까?

  1. Message Queues는 빠른 응답을 원할 때 주로 사용한다.
  2. Message를 많은 사람들에게 전달하고 싶을 때 주로 사용한다.
  3. 두 Application간의 결합도는 Message Queue를 통해 낮출 수 있는 장점이 있다.

용어 설명

:grey_question: Message는 바로 Queue로 갈까 Producer는 exchange [다른 Queue에게 Routing하는 역할을 담당] 에게 Message를 보낸다.

Exchange

type_of_exchange

:heavy_minus_sign: Direct Exchange : Message의 Routing Key와 정확히 일치하는 Binding된 Queue로 Routing

:heavy_minus_sign: Fanout Exchange : Binding된 모든 Queue에 Message에 Message를 Routing

:heavy_minus_sign: Topic Exchange : 특정 Routing Pattern이 일치하는 Queue로 Routing

:heavy_minus_sign: Headers Exchange : key-value로 정의된 Header 속성을 통한 Routing

Message Flow

message_flow

:one: Producer는 Message를 Exchange에 보낸다. – Exchage를 생성할 때 Exchange의 Type을 정해야 한다.

:two: Exchange는 Routing Key를 사용하여 적절한 Queue로 Routing을 진행한다.

– Routing은 Exchange Type에 따라 전략이 바뀌게 된다.

:three: Exchange - Queue와 Binding이 완료된 모습을 볼 수 있다.

– Message 속성에 따라 적절한 Queue에 Routing이 된다.

:four: Message는 Consumer가 소비할 때까지 Queue에 대기한다.

:five: Consumer는 Message를 소비한다.


출처

rabbimq란?, 기초정리, 자세한 개념 1

RabbitMQ 기본 개념, AMQP의 정의

RabbitMQ에 대해