생활정보 🍜

Kafka 가 무엇이고 용도는?

재우니 2024. 12. 18. 20:21

https://nix-united.com/blog/what-is-apache-kafka-main-benefits-use-cases-and-functionalities/

 

 

Kafka를 사용하여 서비스 간 데이터 통신을 관리하는 것에 대해 이해할 수 있도록 쉽게 설명하겠습니다.

1. Kafka란 무엇인가?

Kafka는 메시지 브로커(Message Broker)입니다. 간단히 말하면, 여러 시스템(서버나 애플리케이션)이 서로 데이터를 주고받을 수 있도록 도와주는 시스템입니다. 이 시스템은 데이터를 전달하거나 이벤트를 전파하는 역할을 합니다.

  • 예를 들어, A라는 서비스에서 발생한 특정 데이터를 B라는 서비스로 전달해야 할 때, Kafka는 그 사이에서 데이터를 안전하게 전달하는 다리 역할을 합니다.

2. 왜 Kafka를 사용하는가?

서비스 간 데이터 통신을 관리하려면 많은 시스템들이 서로 데이터를 주고받아야 합니다. 이때 발생할 수 있는 문제들은 다음과 같습니다.

  • 동기화 문제: 한 서비스가 다른 서비스의 데이터를 기다리는 동안 응답이 없으면, 서비스가 멈추거나 지연될 수 있습니다.
  • 데이터 손실: 만약 한 서비스가 데이터를 보내는데, 받는 서비스가 일시적으로 중단되면 그 데이터가 손실될 수 있습니다.
  • 확장성: 시스템이 커질수록 데이터를 효율적으로 관리하고 처리하는 것이 어려워집니다.

Kafka는 이런 문제들을 해결하는 데 도움을 주기 때문에 대규모 시스템에서 많이 사용됩니다.

3. Kafka의 핵심 개념

(1) Producer (생산자)

Producer는 데이터를 보내는 역할을 하는 시스템이나 애플리케이션입니다. 예를 들어, 사용자가 결제를 요청한 서비스가 결제 데이터를 Kafka에 보내면, 이것이 Producer가 되는 것입니다.

(2) Consumer (소비자)

Consumer는 Producer로부터 데이터를 받는 시스템이나 애플리케이션입니다. 예를 들어, 결제 데이터가 Kafka로 들어오면, 이 데이터를 받아서 처리하는 다른 서비스(예: 결제 내역을 저장하는 서비스)가 Consumer가 됩니다.

(3) Topic (토픽)

Kafka에서는 데이터를 Topic이라는 카테고리로 구분하여 전달합니다. Topic은 데이터를 묶는 상자와 비슷한 개념입니다. 예를 들어, 결제와 관련된 데이터는 "payment-topic"이라는 Topic으로 구분될 수 있습니다.

(4) Broker (브로커)

Kafka의 Broker는 데이터를 저장하고, Producer로부터 데이터를 받으며, Consumer로 데이터를 전달하는 역할을 합니다. 여러 개의 Broker가 하나의 Kafka 클러스터를 구성하여, 대용량의 데이터를 효율적으로 처리할 수 있습니다.

(5) Partition (파티션)

Kafka는 데이터를 효율적으로 처리하고 확장하기 위해 데이터를 Partition이라는 여러 부분으로 나눕니다. 이렇게 데이터를 분할하면, 더 많은 시스템이 동시에 데이터를 처리할 수 있게 됩니다.

4. Kafka를 사용하는 이유

Kafka는 높은 성능, 내구성, 확장성 덕분에 대규모 서비스 간 데이터 전송을 효율적으로 관리할 수 있습니다. 주로 다음과 같은 이유로 사용됩니다:

  • 비동기 처리: 데이터를 주고받을 때, 두 서비스가 동시에 작업할 필요가 없습니다. Kafka는 데이터를 기다리는 대신에, 데이터를 큐(Queue)에 저장하고, 필요한 서비스가 그 데이터를 나중에 처리할 수 있게 합니다.
  • 내구성: Kafka는 데이터를 저장하고 복제하여 데이터 손실을 방지합니다.
  • 스케일링: Kafka는 많은 양의 데이터를 빠르게 처리할 수 있기 때문에, 시스템이 커져도 성능 저하 없이 처리할 수 있습니다.

5. Kafka의 사용 예시

예시: 결제 시스템

  • Producer: 사용자가 결제를 요청하는 서비스는 "payment-topic"이라는 Topic에 결제 정보를 Kafka에 보냅니다.
  • Kafka Broker: Kafka는 이 결제 정보를 안전하게 저장하고, 여러 소비자들이 이 데이터를 처리할 수 있도록 합니다.
  • Consumer: 결제 후, 결제 기록을 저장하는 서비스가 "payment-topic"을 구독하여 결제 정보를 받아 처리합니다.

장점:

  1. 비동기 처리: 결제 서비스가 완료될 때까지 기다리지 않고, 다른 작업을 진행할 수 있습니다.
  2. 내구성: 결제 정보가 Kafka에 저장되면, 다른 서비스가 다운되더라도 정보가 손실되지 않습니다.
  3. 확장성: 시스템이 커지면 더 많은 Kafka Broker를 추가하여, 더 많은 데이터를 처리할 수 있습니다.

6. Kafka 운영 시 고려할 점

Kafka를 운영하면서도 몇 가지 중요한 고려사항이 있습니다:

  • 성능: Kafka는 빠르지만, 과도한 데이터가 들어오면 처리 속도가 느려질 수 있습니다. 이때는 시스템을 확장하여 성능을 최적화해야 합니다.
  • 모니터링: Kafka 클러스터가 제대로 동작하는지, 데이터가 잘 처리되고 있는지 모니터링해야 합니다. 장애가 발생하면 즉시 대응할 수 있도록 해야 합니다.
  • 스케일링: 데이터량이 늘어나면, Kafka의 Partition을 늘려서 여러 서비스가 동시에 데이터를 처리할 수 있도록 해야 합니다.

결론

Kafka는 서비스 간 데이터 통신을 원활하게 관리하기 위한 강력한 도구입니다. 데이터를 비동기적으로 처리하고, 내구성확장성을 보장하여, 복잡한 시스템에서 발생할 수 있는 문제들을 해결합니다. 서비스가 커지거나 데이터가 많아지면 Kafka를 통해 보다 효율적이고 안정적으로 데이터를 관리할 수 있습니다.


 

좀 더 쉽게 예시로 안되겠니 ㅋ

Kafka란 무엇인가?

 

Kafka는 분산 메시지 처리 시스템입니다. 데이터를 한곳에서 다른 곳으로 빠르고 안전하게 전달하기 위해 만들어진 도구입니다. 쉽게 말하면 "데이터를 전달하는 우체부" 같은 역할을 합니다.

  • 데이터를 생성하는 곳(보내는 쪽)을 Producer라고 하고,
  • 데이터를 받는 곳(가져가는 쪽)을 Consumer라고 합니다.

Kafka는 Producer가 보낸 데이터를 저장하고, Consumer가 가져갈 수 있도록 중간에서 관리합니다.


Kafka의 작동 방식

Kafka를 쉽게 이해하기 위해, 아래 개념들을 알아봅시다:

 

  1. Topic:
    • 메시지가 저장되는 우체통입니다.
    • 예를 들어, "주문 데이터", "회원가입 데이터" 등 각각의 데이터 종류마다 Topic을 만듭니다.
  2. Producer:
    • Kafka로 데이터를 보내는 프로그램입니다.
    • 예를 들어, "고객이 주문한 정보"를 Kafka에 보내는 역할.
  3. Consumer:
    • Kafka에서 데이터를 가져가는 프로그램입니다.
    • 예를 들어, "배송 시스템"은 Kafka에서 주문 데이터를 가져가서 배송을 처리합니다.
  4. Broker:
    • Kafka 서버입니다. 데이터를 저장하고 전달하는 역할을 합니다.
    • Kafka는 여러 개의 Broker로 구성되어 있어 대량의 데이터도 빠르고 안정적으로 처리할 수 있습니다.

Kafka의 필요성

현대 시스템에서는 많은 서비스가 서로 데이터를 주고받아야 합니다. 예를 들어:

 

  • 전자상거래 사이트:
    • 고객이 상품을 주문하면,
      • 주문 시스템은 "주문 완료" 데이터를 Kafka에 보냅니다.
      • 배송 시스템은 Kafka에서 데이터를 가져와 배송 작업을 시작합니다.
      • 결제 시스템도 Kafka에서 데이터를 가져와 결제 상태를 처리합니다.

 

 

이처럼 Kafka는 여러 시스템이 서로 데이터를 효율적으로 주고받을 수 있도록 돕는 데이터 허브 역할을 합니다.


Kafka가 없다면?

Kafka가 없으면 각 시스템이 데이터를 서로 직접 주고받아야 합니다. 예를 들어:

 

 

  1. 주문 시스템 → 배송 시스템: 직접 API 호출.
  2. 주문 시스템 → 결제 시스템: 또 다른 API 호출.
  • 문제점:
    • 시스템 간의 의존성이 높아짐: 한쪽 시스템이 고장 나면 전체가 멈춥니다.
    • 유지보수 어려움: 데이터 흐름이 복잡해질수록 관리가 어렵습니다.
    • 성능 문제: 대량의 데이터를 직접 주고받으면 처리 속도가 느려질 수 있습니다.

 

 

Kafka를 사용하면 데이터를 중간에 저장하고 관리하기 때문에 이런 문제를 해결할 수 있습니다.


Kafka의 활용 예시

1. 주문 데이터를 처리하는 과정

  • 주문 시스템(Producer):
    • 고객이 주문하면 Kafka의 "order-topic"에 데이터를 보냅니다.
    • 예: {"orderId": 123, "customer": "Alice", "items": ["item1", "item2"]}
  • 배송 시스템(Consumer):
    • Kafka의 "order-topic"에서 데이터를 가져옵니다.
    • 배송 정보를 처리하고 택배를 보냅니다.
  • 결제 시스템(Consumer):
    • 동일한 "order-topic"에서 데이터를 가져옵니다.
    • 결제를 처리하고 고객에게 알림을 보냅니다.

Kafka의 특징

  1. 데이터 손실 방지:
    • Kafka는 데이터를 저장하므로, Consumer가 데이터를 늦게 가져가도 괜찮습니다.
    • 예: 배송 시스템이 잠시 멈춰도 Kafka는 데이터를 보관하고, 시스템이 다시 실행되면 데이터를 가져갈 수 있습니다.
  2. 확장성:
    • 여러 개의 Broker를 추가하여 더 많은 데이터를 처리할 수 있습니다.
  3. 비동기 처리:
    • Producer는 데이터를 Kafka에 보내고 바로 다른 작업을 할 수 있습니다. Consumer는 자신이 필요할 때 데이터를 가져갑니다.

Kafka 운영에서의 고민

  1. 중요한 알림만 받을 수 있을까?
    • Kafka에는 많은 데이터가 오가는데, 정말 중요한 데이터만 필터링해서 받는 방법을 고민합니다.
  2. 서비스 팀의 기술 수준 차이
    • Kafka를 사용하는 팀들이 기술 수준이 다를 때, 쉽고 일관되게 사용할 수 있는 도구와 가이드를 제공합니다.
  3. 클러스터 간 데이터 이동:
    • Kafka의 데이터를 다른 클러스터로 옮겨야 할 때, 각 서비스 팀마다 데이터 구조와 사용 방식이 다르므로 효율적인 방법을 찾아야 합니다.

Kafka가 개발자에게 주는 교훈

  • Kafka는 단순한 "데이터 전달 도구"가 아니라, 시스템 간 데이터를 안전하고 효율적으로 주고받는 방법을 제공합니다.
  • 주니어 개발자로서 Kafka를 이해하면 대규모 데이터 처리와 시스템 설계의 기본을 배울 수 있습니다.
  • Kafka를 처음 배울 때는 Producer와 Consumer를 직접 만들어 간단한 데이터를 주고받는 연습을 추천합니다.

결론: Kafka는 대규모 시스템에서 데이터를 효율적으로 주고받기 위한 강력한 도구입니다. 개발자라면 Kafka의 작동 방식과 실용적인 사용 예시를 통해 데이터 흐름을 이해하고, 시스템 설계의 기본 원리를 배우는 데 큰 도움이 될 것입니다.