[카카오 프로젝트] 알림 도입 배경

paduck·2023년 3월 27일
1

프로젝트

목록 보기
8/11

프로젝트 요구 사항

! 알림을 도입하면 가장 중요하게 생각했던 건 사용자가 접속해있지 않아도 처리되는 것 !

알림 발송 기능이 가능한 기술

  1. 웹소켓(WebSocket) 사용하기
    WebRTC를 공부하면서 조금 공부했던 웹소켓은 애초에 양방향 통신이 가능한 프로토콜이다.
    (그래서 웬만하면 이걸 쓰고 싶었다...)
    그렇다보니, 웹소켓을 사용하면 서버에서 클라이언트로 실시간 데이터를 보낼 수 있는 장점이 있고, Spring Boot의 Spring WebSocket을 사용하여 간단하게 웹소켓을 구현할 수 있다.
    하지만, 사용자가 접속을 종료해 통신이 불가능한 상황이라면 어떻게 해야 하는 문제에 부딪혔다.

  2. Server-Sent Events 사용하기
    Server-Sent Events는 서버에서 클라이언트로 단방향 데이터를 보내는 기술로 Spring Boot에서는 Spring Web Flux를 사용하여 충분한 구현이 가능하다고 하다. 클라이언트에서도EventSource API를 사용하여 Server-Sent Events를 구현할 수 있다.
    하지만, 이미 여기에서 발전한 기술인 웹소켓이 있는데 굳이 이전 기술을 사용할 필요가 있을까?
    더군다나, 사용자가 특정 이벤트에 도달했을 때 -> 즉, 사용자 쪽에서도 데이터를 전송하는데?
    가장 중요한 점은 RDB 와 같은 Blocking I/O 방식은 Non Blocking I/O인 Web Flux와 굳이 같이 사용할 필요는 없다고 생각했다.

  1. 푸시 알림(Push Notification) 사용하기
    서버에서 클라이언트로 알림 메시지를 보내는 기술이다. Spring Boot에서는 FCM(Firebase Cloud Messaging)을 사용하여 푸시 알림을 보낼 수 있다고 한다.
    서비스에 접속하지 않아도 알림을 발송할 수 있는 커다란 장점이 있지만, 대부분 FCM 등의 기술은 모바일 기반의 알림을 전송하는데 큰 목적을 두고 도입한다고 알고 있다. (아직까지는) 웹 기반의 프로젝트에 해당 기술을 도입할 필요가 있을까 고민이 들었다.

  2. 메시지 큐 사용하기
    우선 메시지 큐는 비동기 메시지 처리를 지원하는 소프트웨어 패턴 중 하나이다. 메시지 큐를 사용하면 서버에서 메시지를 보내고, 클라이언트에서는 메시지 큐를 구독하여 메시지를 수신하는 등의 작업을 진행할 수 있다. Spring Boot에서는 RabbitMQ, Apache Kafka, ActiveMQ 등 다양한 메시지 큐를 지원한다고 한다.

    • 메시지 큐를 사용하면 서버에서 알림 메시지를 생성하고, 메시지 큐에 전달한다.
      이후 메시지 큐에 등록된 클라이언트가 해당 메시지를 구독하여 메시지를 수신하게 된다.
      이를 통해 알림 메시지를 받게 되는 것이다.

메시지 큐를 사용하면 높은 처리량과 확장성을 제공하며, 분산 시스템에서도 사용할 수 있는 장점이 있어 클라이언트와 서버 간의 결합도를 낮출 수 있다.
그렇지만, 다른 기술에 비해 구현이 어렵고 여러 조건 등을 확인해야 하는 문제점이 있어서 고민이 드는 것이 현실이다.

일단은 메시지 큐?

메시지 큐를 사용한 알림 구현은 기존의 서버-클라이언트 모델과는 달리, 메시지 큐를 통해 비동기적으로 메시지를 처리하므로 로직이 굉장히 복잡해진다고 한다. 또, 클라이언트에서 해당 알림(이벤트)에 대한 구독(subscribe)이 이루어져야 하므로, 클라이언트에서도 알림을 처리하기 위한 로직이 필요할 것 같다.

하지만, 다르게 생각해보면 메시지 큐를 사용하면 서버에서 메시지 큐에 메시지를 전송하기만 하면 되서, 클라이언트와의 연결을 유지하거나 WebSocket과 SSE를 사용하는 것과 같은 추가적인 연결 작업이 필요하지는 않다. 또한, 서버에서 발생한 이벤트를 메시지 큐에 전송만 하면, (Pub/Sub 큐 패턴에서)메시지 큐에서 처리하는 구독자의 수에 상관없이 모든 구독자에게 알림을 보낼 수 있기 때문에, 다수의 클라이언트에게 알림을 보내는 경우 효율적이다.

또, 근래 메시지큐 기술을 사용하고 있는 회사가 늘어나면서 해당 부분에 대한 학습을 진행해보고 싶다는 욕구가 있었다.

어떤 기술을 쓸까

그럼 이제 고민은 어떤 오픈 소스를 사용할까에 도달했다. 많은 기술들이 있겠지만, 그나마 대중적인 RabbitMQ 와 Kafka 가 물망에 올랐다.

  1. RabbitMQ
    AMQP(Advanced Message Queuing Protocol)을 지원하며, 메시지 브로커(Broker)로써 동작하는 기술이다. RabbitMQ는 메시지의 안정적인 전달과 확장성을 제공하며, 다행히도 Spring Boot에는 RabbitMQ를 쉽게 사용할 수 있도록 스프링 AMQP(Spring AMQP) 모듈이 있습니다. Spring AMQP는 RabbitMQ와의 통합을 지원하고, 스프링의 메시지 추상화(Message Abstraction) 기능을 활용하여 메시지 큐를 구현하는 데 유용하다고 합니다.

  2. Apache Kafka
    분산 스트리밍 플랫폼으로써, 대용량의 데이터를 실시간으로 처리할 수 있다고 한다. Kafka는 높은 처리량과 확장성을 제공하며, 메시지 처리를 위한 다양한 API와 라이브러리를 제공하고 있습니다. Spring Boot에서는 스프링 카프카(Spring Kafka) 모듈을 제공하여 Kafka와의 통합을 지원하여 Kafka Producer와 Consumer를 쉽게 생성하고 구성할 수 있으며, 간단한 예제 코드를 통해 빠르게 시작할 수 있다고 합니다.

결국 RabbitMQ는 스프링 AMQP 모듈을 사용하여 구현하기 쉽고 안정적인 전달과 확장성을 제공하고, Apache Kafka는 스프링 카프카 모듈을 사용하여 대용량 데이터 처리와 높은 처리량을 지원하기 때문에 목적을 좀 더 고민해보고 선택해야 될 것 같다.

profile
끈질기게 들러붙기

0개의 댓글