요즘 주목받는 아키텍처인 MSA가 적용된 시스템을 EDA가 보완할 수 있다. 이때 MSA를 이용하여 서비스를 개발하다 보면, 한 API에서 다른 API로 정보를 전달하고 싶을 때가 있다. 이러한 상황에서 쓸 수 있는 것이 Pub/Sub 모델이다.
Kafka: 소셜 네트워크 서비스, 링크드인에서 개발함.
→ 모든 시스템으로 데이터를 전송할 수 있고, 실시간 처리도 가능하고, 급속도로 성장하는 서비스를 위해 확장이 용이한 시스템을 만들자
Message Queue(MQ)
MOM(Message Oriented Middleware)를 구현한 시스템
메시지는 Endpoint 간 직접 통신하지 않고, Queue을 통해 중개됨
Producer
: 정보 제공 하는 자
Consumer
: 정보 제공 받는 자
MQ
: Producer
의 데이터를 임시 저장하고 Consumer
에게 제공하는 곳
Message Broker(Redis)
Publisher
가 생산한 메시지를 MQ에 저장 + 저장한 메시지를 Subscriber
에 전달publisher
는 수신자가 없어도 publish
가능, Subscriber
는 Subscribe
한 메시지만 수신 가능, 발신자 정보가 없어도 수신할 수 있음. Subscriber
가 메시지를 가져가면, 짧은 시간 안에 큐 내 데이터가 삭제됨.Event Broker(Kafka)
Subscriber
가 특정 시점부터 이벤트를 다시 Subscribe
할 수 있음Publisher - Channel - Subscriber
특징
channel
subscriber
channel
동시 구독 가능channel
을 지정하지 않아도, 패턴을 설정할 수 있어 이에 맞는 채널 구독 가능장단점
Producer - Topic - Consumer
(Publisher - Channel - Subscriber와 동일 개념)
Topic
은 여러 Broker
에 분산 저장되며, 분산된 Topic
을 partition
이라 함ZooKeeper
동작 방식
Producer
: 전달하려는 메시지를 Topic에 전달
Topic
: Topic의 각 Partition에 이벤트가 분산되어 저장(카테고리화)
Consumer
: 구독하고 있는 Topic의 1개 이상의 partition으로부터 이벤트를 가져옴(=메세지를 읽음)
+Broker
들이 하나의 Cluster
로 구성되어 동작하도록 설계되어 있음
+Cluster
내 Broker
분산 처리 담당은 ZooKeeper
장점
1. 이벤트의 저장 여부
2. 한 이벤트를 받을 수 있는 Subscriber(Consumer) 개수
만약 AWS를 통해 서버를 배포하는 중이라면 Scale-out 등의 이유로 서버 인스턴스가 여러 개 작동하고 있을 수 있다. 이때, 앞선 예시에서 Coupon 서비스는 유저 회원 가입에 대한 Topic을 구독하고 있으며, 회원가입을 했다는 이벤트를 받으면 기념 쿠폰을 발행한다고 가정하자. 이때 Coupon 서비스는 2개의 서버를 사용한다고 하자.
Kafka: Consumer의 수와 관계없이, 유저 회원가입당 하나의 쿠폰이 발행
Redis: User는 1번의 회원가입으로 2개의 쿠폰을 얻게 됨
Redis는 Group 구분이 없기 때문
내가 개발한 Gateway의 권한 플러그인에서, 존재하는 모든 권한 목록을 서버가 ‘시작될 때’ 가져온다. 이때 새로운 권한 추가 / 삭제 시 서버 재시작 전까지는 권한 목록을 갱신할 수가 없다는 문제가 발생한다.
Kafka: gateway 서버가 두 개 이상 뜨더라도, 각각의 서버는 같은 Consumer Group에 속하기 때문에, Permission Service에서 보낸 이벤트를 단 한 서버만 받을 수 있다. 결국 권한 목록의 갱신은 하나의 서버 인스턴스에만 이루어지게 되고, 이는 synchronization 문제를 낳는다.
Redis: Redis는 Group이라는 개념이 없기 때문에, Gateway Server가 여러 개 뜬다고 하더라도 각각이 이벤트를 받을 수 있다
Kafka
: 대용량 데이터 처리, 실시간, 고성능, 고가용성이 필요한 경우Redis
: 메시지를 DB에 저장하기 때문에 이벤트를 미들웨어에 저장할 필요가 없는 경우, 꼭 알람이 도착한다는 보장 없이 Push 보내는 것만 중요한 경우, 발행된 이벤트가 모든 Subscriber에서 발생되어야 하는 경우ref) 카프카란 무엇인가