본문 바로가기

카테고리 없음

Kafka(카프카)

Event Streaming platform

 

  •  고성능 데이터 파이프라인 구축에 활용된다
  •  처음에는 간단한 서비스는 단방향 통신으로 충분하지만
  •  서비스의 양이 늘어나면 간단한 기능을 위한 파이브라인이 매우 복잡해짐
  •  서비스가 세분화되고 나눠지면서 이 서비스들 사이의 정보 교환을 어떻게 할것인가? (Http로 할수 있으나 거미줄처럼 됨)

 

 

Apache Kafka 등장

발생하는 모든 사건들을 Kafka에 전달

  • 사건들에 대해 알아야 하는 서비스가 해당 정보를 구독하고 서비스를 제공한다.
  • Event Driven Architecture (사건이 발생하면 프로세스가 진행됨, 즉 이벤트가 트리거) 

 

개별 서비스의 결합력이 줄어든다.(카프카만 구독하면 되니까)

-> 독립적으로 발전할수 있다.

 

RabbitMQ vs Kafka?

성능의 차이가 있을 뿐이다?

  • RabbitMQ: 메시지의 보관 보다는 전달에 초첨을 맞춘 Message Broker
  • Kafka: 대량의 사건(Event)의 흐름(Stream)을 관리하고 보관 (메시지 관리에 초점)

RabbitMQ는 애플리케이션 간의 비동기 통신에 초점 -> 기능적 측면의 개발에서 유용

Kafka는 고가용성의 이벤트 저장소 -> 많은 데이터를 안정적으로 관리하는데 유용(RabbitMQ 상위호환)

 

Topic

Kafka에 전달딘 메시지를 분류하는 단위

  • 말그대로 주제
  • 데이터베이스의 테이블, 파일시스템의 폴더 같이

 

 

Topic - Partition

Topic 내부에서 실제로 데이터가 순차적으로 쌓이는 곳

  • 순서를 가지고 저장된다 (Offset)
  • Partition의 데이터는 읽어도 사라지지 않는다 (RabbitMQ랑 가장 큰 차이점)

 

Partition을 늘릴수는 있지만, 줄일수는 없다

  • 영속성을 나타내는 데이터이기 때문에 Partition을 삭제하는것은 데이터를 삭제하는 행위이다.

 

Consumer Group

Consumer의 갯수만큼 Partition에서 동시에 데이터를 가져온다

  • 이때 여러 Consumer를 Group으로 묶으면 하나의 데이터를 Group의 하나의 Consumer만 읽는다 (병렬 처리 가능)

 

Broker

Kafka가 설치된 서버

- 여러개의 kafka Broker를 구성해 Cluster를 만들면, 한 서버에 문제가 생겨도 대처할수 있다.

 

Broker - Replicaiton

Broker가 여럿일때, Replicaiton Factor를 정의

- 여러개의 Broker를 거쳐 Topic의 Partition이 복제된다.

- 실제로 메세지를 받는 Leader와 Leadewr의 데이터를 복제하는 Follower로 구성

 

 

Leader에 문제가 생기면 다른 Broker에서 Leader의 역할을 이어받는다.

- 이후 Broker가 다시 돌아오면 Leader로부터 손실된 데이터 복구 가능(새로운 Follower가 된다)

 

 

Ack

Producer가 데이터를 전달할때, Replication에 데이터가 저장됐는지 확인하는 설정

- Ack: 0 , 요청만 보냄(안전성은 낮지만 속도가 빠름)

- Ack: 1, 요청을 보내고 리더만 응답(안전성 보통이고 속도 보통)

- Ack: all, 요청을 보내면 모든 Replication이 응답(안전성 높고 속도 느림)

 

 

카프카 실행하기

카프카 설치

https://kafka.apache.org/downloads

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

 

주키퍼 먼저 실행 (브로커들을 관리)

 

/kafka$ ./bin/zookeeper-server-start.sh config/zookeeper.properties

 

카프카 실행

 

/kafka$ ./bin/kafka-server-start.sh ./config/server.properties

 

이때 /tmp 에 로그가 생성되니 초기화 하려면 /tmp의 카프카 로그들과 주키퍼를 초기화해야함 (여기서 부터 읽고 시작하기 때문)

 

토픽 생성

 

/kafka$ ./bin/kafka-topics.sh --create --topic first-topic --bootstrap-server localhost:9092

 

토픽 확인

 

/kafka$ ./bin/kafka-topics.sh --describe --topic first-topic --bootstrap-server localhost:9092

 

프로듀서 생성

 

/kafka$ ./bin/kafka-console-producer.sh --topic first-topic --bootstrap-server localhost:9092

 

컨슈머 생성

 

/kafka$ ./bin/kafka-console-consumer.sh --topic first-topic --from-beginning --bootstrap-server localhost:9092

 

이렇게하면 프로듀서에서 생성한 메서지를 바로 컨슈머에서 확인 가능하다.