-
Kafka, Redis🎸 2024. 9. 17. 15:09
Message Queue
메세지 지향 미들웨어(MOM: Message Oriented Middleware)를 구현한 시스템으로 프로세스 간의 데이터를 교환할 때 사용하는 기술이다.
- message는 endpoint 간 직접적으로 통신하지 않고, 중간의 queue를 통해 중개된다.
- Producer: 정보를 제공하는 자
- Consumer: 정보를 제공받아 사용하려는 자
- Queue: Producer의 데이터를 임시 저장 및 Consumer에 제공
Broker
Message Broker
publisher가 생산한 메세지를 message queue에 저장하고, 저장된 데이터를 consumer가 가져갈 수 있도록 중간 다리 역할을 수행한다. pub/sub 구조로서, 대표적으로 Redis, RabbitMQ 소프트웨어, GCP의 pubsub, AWS의 SQS 서비스가 있다.
- 서로 다른 시스템(혹은 소프트웨어) 사이에서 데이터를 비동기 형태로 처리하기 위해 사용한다.
- 대규모 엔터프라이즈 환경의 미들웨어로서의 기능을 수행한다.
- consumer가 message queue에서 데이터를 가져가게 되면 즉시 혹은 짧은 시간 내에 큐에서 데이터가 삭제된다.
Event Broker
메세지 브로커의 큐 기능을 가지고 있어 메세지 브로커의 역할을 수행할 수 있다. 대표적으로 Kafka, AWS의 kiness 서비스가 있다.
- publisher가 생산한 event를 처리 후에 바로 삭제하지 않고 저장한다.
- 즉, 이벤트 시점이 저장되어 있어 consumer가 특정 시점부터 이벤트를 다시 consume할 수 있어 장애 발생 시 처리에 용이하다.
- 대용량 처리에 있어서 메세지 브로커보다 더 많은 데이터를 처리할 수 있다.
PUB/SUB
Publish/Subscribe(게시자/구독자) 패턴의 약어로, 메세지를 보내는 게시자(publisher)와 메세지를 수신하는 구독자(subscriber) 간의 비동기적인 통신을 가능하게 한다.
- 이벤트(메시지)를 발행하는 Publisher가 존재하며, Publisher는 특정 Channel(혹은 Topic)에 이벤트를 전송한다.
- 특정 Channel(혹은 Topic)을 구독하는 Subscriber가 존재하며, Publisher에 관계없이 발행된 이벤트를 받을 수 있다.
Kafka
Kafka는 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 설계된 고성능 분산 이벤트 스트리밍 플랫폼이다.
Pub-Sub 모델의 메시지 큐 형태로 동작하며 분산환경에 특화되어 있다.
- Producer/Consumer라는 개념으로 작동하며 각각 Publisher/Subscriber와 그 기능이 동일하다. Producer는 Topic에 이벤트를 보내고, 이 이벤트는 Topic의 각 Partition에 분산되어 저장된다.
- Topic을 구독하고 있는 Consumer group 내의 Consumer는 각각 1개 이상의 partition으로부터 이벤트를 가져온다. publisher와 subscriber는 오로지 topic 정보만 알 뿐, 서로에 대해 알지 못한다.
* 만약 partition 개수보다 consumer 개수가 많다면, 아무 일도 하지 않는 consumer가 생기기 때문에, 항상 partition 수를 consumer보다 같거나 크게 해주는 것이 좋다. - kafka는 broker들이 하나의 클러스터로 구성되어 동작하도록 설계한다. 클러스터 내의 broker에 대한 분산처리는 ZooKeeper가 담당한다.
한 이벤트에 대해 한 번의 기능만 작동되어야 한다면 Kafka를 사용하는 것이 유리하다.
Redis
Redis는 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 데이터베이스, 캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 인메모리 데이터 구조 저장소이자 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다.
- Redis에는 그룹이라는 개념이 존재하지 않고, 각 subscriber가 channel을 구독하고 있다.
- Channel은 이벤트를 저장하지 않는다. 만일 Channel에 이벤트가 도착했을 때, 해당 채널의 Subscriber가 존재하지 않는다면, 이벤트는 사라진다.
- Redis의 Channel은 말 그대로, TV의 Channel을 생각하면 된다. 하루 종일 TV에서는 수백 개의 채널에서 방송이 방영된다. 각 방송사(Publisher)에서 방영하는 라이브 방송은, 해당 채널을 시청 중일 때만 볼 수 있다. 또한 같은 시간대에 같은 채널의 시청자(Subscriber)들은 모두 같은 방송을 볼 수 있다.
발행된 이벤트에 대해 모든 Subscriber에서 특정 작업이 발생되어야 하는 경우 Redis를 사용하는 것이 유리하다.
참조
'🎸' 카테고리의 다른 글
[Java] 공공데이터포털 Open API 파싱, JPA (0) 2024.08.08 [Java] 자주 사용되는 Lombok 어노테이션 (0) 2024.06.22 [Python] deque 자료구조 (0) 2024.06.08 [Python] DFS (0) 2024.06.07 [VS code] Code Runner 사용 시 터미널에 실행 결과 출력하기 (1) 2024.04.03