Kafka
Kafka 는 분산 메시징 시스템이다
대량의 데이터를 빠르게 전달하고, 비동기적으로 처리할 수 있도록 설계되어있다.
1 Kafka 주요 개념
1.브로커(Broker)
1) Kafka 클러스터를 구성하는 서버 또는 인스턴스
2) Kafka 클러스터는 여러개의 브로커로 구성되며, 각 브로커는 여러개의 토픽을 저장하고 관리한다.
3) 클라이언트는 이 브로커를 통해 데이터를 주고받는다.
2. 토픽(Topic)
1) 데이터가 저장되는 단위
2) likes_topic, comments_topic 처럼 각각의 타입마다 토픽을 따로 설정할 수 있다.
3) 토픽은 여러개의 파티션으로 나뉘며, 파티션 단위로 메시지가 분산되어 저장된다.
3. 파티션(Partition)
1) 각 토픽은 하나 이상의 파티션을 가질 수 있다. 파티션을 통해 데이터를 분산하여 저장하고,병렬 처리가 가능해진다.
2) 파티션은 데이터의 순서를 보장해준다. 파티션 간의 순서 x 파티션 내에서 저장되는 순서 O
4. 프로듀서(Producer)
1) Kafka로 데이터를 전송하는 클라이언트를 말한다.
2) 프로듀서는 Kafka 브로커에 데이터를 보내고, 특정 토픽과 파티션을 지정하여 메시지를 저장할 수 있다.
5. 컨슈머(Consumer)
1) KafKa에서 데이터를 읽어오는 클라이언트를 말한다.
2) 컨슈머는 특정 그룹에 속하며, 같은 그룹에 속한 여러 컨슈머가 토픽의 데이터를 나눠서 읽을 수 있다.
3) 컨슈머 그룹을 사용하면 파티션 단위로 데이터를 병렬로 처리할 수 있어 확장성이 높다.
6. 오프셋(Offset)
1) 각 파티션 내에서 메시지의 위치를 나타내는 고유한 ID, 컨슈머가 메시지를 어디까지 읽었는지 확인할 수 있다.
2) 즉, 컨슈머는 오프셋을 기반으로 데이터의 읽기 위치를 기억합니다.
2 KafKa의 동작 원리
1. 프로듀서가 메시지 전송 (등록하는 유저 느낌)
1) 프로듀서는 Kafka의 특정 토픽에 메시지를 전송합니다.
2) 메시지는 하나의 파티션에 저장되며, 파티션을 선택하는 방식은 설정에 따라 달라질 수 있습니다.
2. 브로커가 메시지 저장 (체감상 서버 느낌)
1) Kafka는 기본적으로 로그 구조를 기반으로 메시지를 파티션에 순서대로 저장합니다.
2) 메시지는 지정된 보관 시간이 지나기 전까지 브로커에 저장되며, 컨슈머가 데이터를 소비할 때까지 유지됩니다.
3. 컨슈머가 메시지 소비 (조회하는 유저 느낌)
1) 컨슈머는 Kafka 브로커에서 데이터를 읽어 오프셋을 이동시키며 메시지를 소비합니다.
2) 컨슈머 그룹을 사용하면 같은 그룹에 속한 컨슈머들이 메시지를 분산해서 처리하게 되어, 부하를 줄일 수 있습니다.
3 Kafka 설정 항목
1. 기본 설정
1) Kafka 클러스터의 IP 주소 및 포트를 지정합니다.
2) 기본적으로 localhost : 9092 를 사용하지만, Docker 로 실행할 경우 컨테이너의 IP와 포트를 맞춰야합니다.
2. Producer 설정
1) 프로듀서는 Kafka로 데이터를 보내는 역할
2) 전송할 메세지의 키와 값을 직렬화하는 방법을 설정합니다.
3) 일반적으로 StringSerializer를 사용하여 문자열 형태로 메시지를 전송합니다.
3) spring.kafka.producer.key-serializer : 키 , spring.kafka.producer.value-serializer : 값
3. Consumer 설정
1) 컨슈머는 Kafka로부터 데이터를 읽어오는 역할
spring.kafka.consumer.group-id
2-1) 컨슈머 그룹 ID를 지정합니다. 같은 그룹 ID 를 가진 컨슈머끼리 토픽의 파티션을 나누어 읽습니다.
2-2) ex. likes_consumer_group 좋아요 그룹
spring.kafka.consumer.auto-offset-reset
3-1) 컨슈머가 읽기 시작할 오프셋을 지정하는 옵션
3-2) earliest : 맨 처음부터 데이터를 읽어옵니다.
3-3) latest : 최근 오프셋부터 데이터를 읽어옵니다.
4) Kafka에서 데이터를 읽을 때 키와 값을 역직렬화하는 방법을 지정합니다. 4-1) 일반적으로 StringDeserializer를 사용하여 문자열 형태로 읽습니다. 4-2) spring.kafka.consumer.key-deserializer, 앞은 같고 뒤만 value-deserializer
요약
Kafka는 분산 메시징 시스템으로 대규모 데이터를 처리하고, 비동기 메시징을 위한 기능을 제공한다.
브로커가 큰 통이고, 토픽은 데이터 저장 상위 개념, 파티션은 데이터 저장 하위 개념(토픽을 여러개로 나눔),
프로듀서는 데이터 전송 및 저장하는 클라이언트고, 컨슈머는 데이터를 읽어오는 클라이언트다.
오프셋은 컨슈머가 어디까지 읽었는지 확인하는 용도!
설정 요약
사용하려면 서버 주소 및 포트를 설정하고,
프로듀서가 카프카로 데이터 보낼때 값 바꾸는 용 key- value 를 설정하고,
컨슈머가 카프카에서 데이터 읽을 때 값 바꾸는 용 key- value 를 설정하고,
컨슈머 그룹도 있다 = 같은 그룹이면 토픽의 파티션을 나누어 읽음 파티션이 약간 스레드 느낌처럼 ??
오프셋도 설정. earliset : 처음 데이터부터 / latest : 마지막 데이터부터