왜 카프카를 사용하는가?
왜 카프카인가?
Kafka vs Redis vs RabbitMQ ...
다양한 메시지 전달 시스템들이 있는데 왜 Kafka가 많은 업체들에서 사용하고 있을까?
Redis
메시지 브로커
특정 주제(topic)에 메시지를 Publish하면, 이 Topic에 Subscribe를 한 클라이언트는 메시지를 받을 수 있는 구조.
메시지를 던지는 시스템이기 때문에, 메시지를 따로 보관하지도 않는다.
클라이언트가 메시지를 받는 것을 보장하지 않아, Sub 대상이 하나도 없는 상황에서 메시지를 Pub해도 메시지가 소실된다. (전송이 보장되지 않는 기능에 사용해야 한다.)
캐시의 역할도 가능하다.
명시적으로 데이터 삭제가 가능하다.
메모리 기반이므로 서버가 다운되면 Redis내의 모든 데이터가 사라진다.
RabbitMQ
메시지 브로커
구성이 쉽다.
교환소에서 복잡한 라우팅 키를 이용한 대기열을 이용해 메시지를 어디로 보낼지 결정
메시지를 특정 순서로 보내고 대기열에 추가해 우선순위가 높은 메시지부터 처리를 할 수 있다.
데이터 손실의 위험성
메시지 전송 용량이 커질수록 성능이 저하된다.
Kafka
이벤트 브로커
다중 프로듀서, 컨슈머로 처리하는 방법이 편리하다. 많은 컨슈머가 있어도 상호 간섭 없이 어떠한 메시지 스트림도 읽을 수 있도록 설계되어 있다.
디스크 기반으로 메시지를 지속성 있게 저장할 수도 있어 컨슈머들이 항상 실시간으로 데이터를 읽어올 필요가 없다.
토픽별로 설정이 가능하기 때문에 서로 다른 메시지 스트림이 컨슈머의 필요에 따라 서로 다른 기간 동안 보존될 수 있다는 장점이 커 데이터 유실의 위험이 없다.
카프카 컨슈머는 polling 방식으로 브로커에서 메시지를 던지는게 아니라 컨슈머에서 가져간다.
메시지 브로커
메시지를 받아서 적절히 처리하면 짧은 시간 내에 메시지가 삭제되는 특징이 있다.
데이터 손실의 위험이 있다.
이벤트 브로커
메시지 정보를 하나만 보관하고 인덱스를 통해 개별 액세스를 관리한다.
업무상 필요한 시간 동안 이벤트를 관리한다.
메시지를 이벤트 브로커의 큐에 저장한다.
메시지 브로커는 이벤트 브로커의 역할을 할 수 없지만, 이벤트 브로커는 메시지 브로커의 역할을 할 수 있다.
카프카를 사용하는 이유
여러 가지 문서를 찾아보고 정보들을 찾아본 결과 카프카를 사용하는 이유는 크게 4가지 정도인 것 같다.
- 기능별 분산 처리를 통한 효율적인 성능향상
- 이벤트 브로커로써의 장점
- 확장이 쉽다. (프로듀서를 늘리던, 컨슈머를 늘리던, 브로커를 늘리던 다른 방법들에 비해 쉽게 확장할 수 있다.)
- 메시지의 보존이 가능해 시스템이 안정적이다. (데이터 보장성, 내장성 등이 좋다)
- 함께 사용할 수 있는 기술이 많다. (kafka connect, kafka streams, apache hadoop 등)
가볍고, 대용량 데이터를 다루지 않는 경우에는 RabbitMQ를 사용하는 것도 좋을 수가 있지만, 서비스가 어떻게 바뀔지 모르기 때문에 처음부터 Kafka를 고려하는 것도 나쁘지 않아 보인다. 괜히 여러 많은 기업들이 Kafka를 도입하고 있는 게 아니지 않을까..? 에 대한 조금의 궁금증이 풀린 것 같다.
다음으론 카프카의 기본적인 작동 방식을 알아보고 왜 시스템이 안정적이고 메시지의 유실을 막을 수 있는지 확인을 해보도록 해야겠다.