미들웨어 : 서로 다른 애플리케이션이 서로 통신하는 데 사용되는 소프트웨어
메세지 지향 미들웨어 (MOM) : 비동기적(Asynchronous) 방식을 이용해서 프로세스간의 데이터를 주고 받는 시스템
QUEUE(FIFO) 자료구조를 이용해서, MOM을 구현한 시스템
메세지를 발행하고 전달하는 부분을 Producer
메세지를 받아서 소비하는 부분을 Consumer
와
ProducerConsumer
를 연결하는 것이 Message Queue
메시지 큐의 장점
1. 비동기(Asynchronous): Queue에 넣어두기 때문에 나중에 처리 가능
2. 낮은 결합도(Decoupling): 애플리케이션과 분리
3. 탄력성(Resilience): 실패가 전체 시스템에 영향 X
4. 과잉(Redundancy): 실패 할 경우 재실행이 가능
5. 신뢰성(Guarantees): 작업이 처리된 걸 확인 및 모니터링 가능
6. 확장성(Scalable): 부하 처리 방식이 편리
확장성 예시 1: Consumer 부족으로 부하 발생
⇒ Consumer를 5개로 늘림 → 큐가 병렬로 빨리 비워짐
확장성 예시 2: API 서버가 병목이라 Producer 확장
⇒ Producer 서버 수를 늘려 메시지 큐로 더 많은 요청을 밀어 넣음
메세지 브로커(Message Broker)
Consumer
가 메세지 큐에서 데이터를 가져가게 되면 짧은 시간 내에 메세지 큐에서 삭제ex) RabbitMQ, ActiveMQ, AWS SQS, Redis
Kafka : 분산 이벤트 스트리밍 플랫폼 (이벤트 브로커 이용)
⇒ 여러 개의 이벤트 전송 Broker(서버)로 구성된 클러스터
Zookeeper : 분산 애플리케이션을 위한 코디네이션 시스템
⇒ 여러 분산 시스템의 중앙 관리 프로그램
KAFKA에서는
Zookeeper ⇒ 위와 같은 데이터를 어딘가에 저장하고 조율
KAFKA의 구조
event : 데이터
event stream : 관련된 이벤트들
topic : kafka에서 event stream의 명칭
partition : topic을 분산 저장하는 가장 작은 단위 (for 병렬 전달)
Subscribe 동작 ⇒ (Consumer가 카프카를 확인)
https://imbf.github.io/interview/2020/12/10/NAVER-Interview-Preparation-2.html
https://medium.com/frientrip/pub-sub-%EC%9E%98-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-de9dc1b9f739
데이터 = 이벤트
Consumer
가 소비한 데이터를 필요한 경우 다시 소비 가능⇒ consumer가 특정 시점부터 이벤트를 다시 consume 할 수 있는 장점(ex : 장애가 일어난 시점부터 그 이후의 이벤트를 다시 처리할 수 있음)
이벤트 브로커는 기본적으로 메세지 브로커의 역할 가능!
but 반대로 메세지 브로커는 이벤트 브로커의 기능 불가!
⇒ 이벤트 브로커가 더 만능
Zookeeper = 클러스터 메타데이터 + 상태 + 역할 + 리더 선출의 중심 시스템
[kafka]
Assigned partitions:
- a-0
- a-1
- b-0
- d-0
[consumer]
fetch a-0 from offset 0
fetch a-1 from offset 2
fetch b-0 from offset 1
fetch d-0 from offset 0