-
왜 kafka를 사용하는것인가? 만약 kafka가 없었다면..?웹서버/kafka 2024. 10. 3. 08:42728x90반응형
Kafka 없이 데이터를 처리할 때의 복잡성
- 서버 간 직접 연결: 여러 서버가 서로 다른 데이터를 교환하거나 서로 필요한 데이터를 받아오기 위해 서버 간 직접적인 연결을 설정해야 합니다. 예를 들어, 서버 A에서 생성된 데이터를 서버 B, C, D가 각각 받으려면, 각 서버 간에 개별적으로 데이터를 주고받는 코드를 작성해야 합니다.
- 다양한 프로토콜: 각 서버가 데이터를 다르게 처리하거나, 사용하는 통신 프로토콜이나 데이터 포맷이 다를 경우, 데이터 변환과 통신을 위한 코드가 더 복잡해질 수 있습니다.
- 실시간 데이터 처리의 어려움: 데이터를 실시간으로 여러 곳에서 동시에 처리하려면, 각각의 서버 간 데이터 동기화를 관리해야 하며, 이 역시 복잡한 문제로 이어집니다.
이렇게 여러 서버 간에 직접 데이터를 주고받는 방식은 시스템이 커질수록 복잡해지고, 유지보수가 어려워지며, 확장성에도 한계가 생깁니다.
Kafka를 사용할 때의 단순화된 구조
Kafka는 중앙 허브 역할을 합니다. 데이터를 필요로 하는 서버들이 모두 Kafka를 통해 데이터를 주고받기 때문에 복잡성이 크게 줄어듭니다.
- 중앙 집중화: Kafka를 이용하면, Producer(데이터를 생성하는 서버)는 Kafka에 데이터를 보내기만 하면 되고, Consumer(데이터를 소비하는 서버)는 Kafka에서 데이터를 구독해서 가져가기만 하면 됩니다. 모든 서버가 Kafka와만 소통하므로, 서로 간의 직접적인 연결이 필요 없습니다.
- 확장성: 각 서버는 자신이 필요로 하는 Topic만 구독하면 되므로, 새로운 기능이 추가되거나 다른 시스템이 데이터를 필요로 할 때도 Kafka에 연결하기만 하면 됩니다. 이 방식은 매우 유연하고 확장 가능합니다.
- 다양한 처리 방식: Kafka를 통해 데이터를 여러 Consumer가 동시에 구독할 수 있으므로, 하나의 데이터를 여러 서버가 동시에 받아서 각각 다른 방식으로 처리할 수 있습니다. 예를 들어, 한 Consumer는 실시간 데이터 분석을 하고, 다른 Consumer는 데이터를 저장하거나 백업하는 작업을 할 수 있습니다.
예시로 비교해보자면:
Kafka를 사용하지 않을 때:
서버 A에서 데이터를 생성하고 서버 B, C, D가 그 데이터를 필요로 한다고 가정해봅시다. 이 경우 서버 A는 각 서버 B, C, D에 데이터를 직접 전송해야 합니다. 이렇게 되면 서버 A는 데이터를 전송하는 로직을 세 번 따로 작성해야 하고, 각 서버가 데이터 수신을 위한 별도의 코드도 필요합니다.
Kafka를 사용할 때:
서버 A는 Kafka에 데이터를 보내고, 서버 B, C, D는 Kafka에서 필요한 데이터를 구독하기만 하면 됩니다. 서버 A는 데이터를 한 번만 전송하면 되고, 서버 B, C, D는 Kafka와만 연결되면 됩니다. 이 구조는 매우 단순하고 효율적입니다.
따라서 Kafka를 도입하면 서버 간 데이터 송수신 구조가 단순화되고, 유지보수와 확장성이 훨씬 수월해집니다.
Kafka 시나리오 예제
시나리오:
고객이 웹사이트에서 주문을 했을 때, 이 주문 데이터는 다음과 같은 여러 서비스에서 사용됩니다.
- 결제 서비스: 주문에 대한 결제가 필요합니다.
- 배송 서비스: 주문을 처리하고 배송 상태를 관리합니다.
- 알림 서비스: 고객에게 이메일이나 SMS로 주문 확인 메시지를 보냅니다.
- 분석 서비스: 주문 데이터를 수집하여 판매 통계를 분석합니다.
1. Kafka 없이 데이터를 처리하는 경우
이 경우 각 서비스는 주문 데이터를 받아야 하므로, 주문 서비스와 직접적으로 통신해야 합니다. 시스템은 복잡한 구조로 변할 수 있습니다.
구조:
- 주문 서비스는 결제, 배송, 알림, 분석 서비스에 직접 데이터를 전송합니다.
- 각 서비스는 주문 서비스와 개별적인 통신 경로를 설정하고, 데이터를 주고받기 위한 API 또는 메시지 큐를 운영해야 합니다.
문제점:
- 복잡한 통신 경로: 주문 서비스는 결제, 배송, 알림, 분석 서비스 각각과 통신해야 하므로, 서비스가 늘어날수록 복잡성이 증가합니다. 만약 새로운 서비스가 추가된다면, 주문 서비스는 다시 수정되어야 합니다.
- 확장성 문제: 주문 건수가 늘어나면, 주문 서비스는 여러 곳에 동시에 데이터를 보내야 하므로, 성능에 부담이 생길 수 있습니다. 하나의 서비스가 지연되거나 다운되면 다른 서비스에도 영향을 줄 수 있습니다.
- 데이터 일관성: 각 서비스에 데이터를 따로 보내야 하므로, 동시성 이슈나 데이터 손실이 발생할 가능성이 큽니다.
(고객) -> 주문 서비스 -> [결제 서비스, 배송 서비스, 알림 서비스, 분석 서비스]
주문 서비스는 각 서비스를 직접 호출하고, 데이터를 보내는 로직을 각각 관리해야 합니다.
2. Kafka를 사용하는 경우
Kafka를 사용하면 주문 서비스는 Kafka에 데이터를 한 번만 보내면 됩니다. 다른 서비스들은 Kafka에서 데이터를 구독(consume)하는 방식으로 처리합니다.
구조:
- 주문 서비스는 Kafka의 특정 Topic(예: "orders")에 주문 데이터를 보냅니다.
- 결제, 배송, 알림, 분석 서비스는 Kafka에서 동일한 Topic을 구독하여 각자 필요한 데이터를 가져와 처리합니다.
장점:
- 간단한 구조: 주문 서비스는 Kafka에만 데이터를 전송하고, 각 서비스는 Kafka에서 데이터를 구독하여 처리하므로 통신 경로가 단순해집니다.
- 높은 확장성: 새로운 서비스가 추가되어도, Kafka의 Topic만 구독하면 되기 때문에 주문 서비스는 수정할 필요가 없습니다.
- 실시간 데이터 처리: 각 서비스는 실시간으로 데이터를 받아 바로 처리할 수 있습니다.
- 데이터 일관성: Kafka는 데이터를 안전하게 저장하고 복제하므로, 데이터 손실의 위험이 적고 여러 서비스가 동시에 데이터를 받아도 문제없습니다.
예시:
plaintext코드 복사(고객) -> 주문 서비스 -> Kafka -> [결제 서비스, 배송 서비스, 알림 서비스, 분석 서비스]주문 서비스는 Kafka에 데이터를 보냅니다. Kafka에 있는 데이터는 각 서비스가 독립적으로 구독하고 처리합니다.
차이점 요약
Kafka 없이Kafka 사용
주문 서비스가 모든 서비스에 데이터를 직접 보내야 함 주문 서비스는 Kafka에만 데이터를 보내고, 각 서비스가 Kafka에서 데이터를 가져감 통신 경로가 복잡하고, 서비스 간 결합도가 높음 통신 경로가 간단하고, 서비스 간 결합도가 낮음 새로운 서비스가 추가될 때마다 주문 서비스 수정 필요 새로운 서비스는 Kafka Topic을 구독하기만 하면 됨 주문 서비스에 부하가 커지고 확장성에 제한이 있음 서비스 간 독립적으로 데이터를 처리하므로 확장성이 뛰어남 데이터 손실 위험과 동기화 문제 발생 가능 Kafka는 데이터를 안전하게 저장하고 복제하여 데이터 손실 위험을 줄임 결론:
Kafka를 사용하면 시스템의 확장성과 유연성이 크게 향상됩니다. 서비스 간 통신이 단순화되고, 주문 서비스와 각 기능이 다른 서비스 간의 의존성을 줄일 수 있어, 유지보수와 성능 관리 측면에서 훨씬 효율적입니다.
728x90반응형'웹서버 > kafka' 카테고리의 다른 글
kafka란?,Zookeeper (0) 2024.04.25