MSA 를 하는데 kafka를 같이 도입해서 많이 사용한다.
그렇기에 MSA 가 늘어나면서 Kafka도 많이 사용 중
kafka는 대용량 데이터를 처리할 수 있는 메시지 큐임
동기적 처리 -> 순차적으로 처리함 (a 작업이 끝타면 b 작업을 시작함)
비동기적 처리 -> 병렬적으로 처리함
rest api vs 메시지 큐
rest api는 동기적
메시지 큐는 비동기적임
프로듀서 서버에서 rest api 요청을 전달 받아서 메시지로 만듬. -> 이걸 메시큐에 저장함.
프로듀서는 메시지를 만들자마자 유저에게 응답 메시지를 보냄.(전송이 완료 안 되어도 일단 응답을 보냄)
ex) 이메일 전송 요청이 완료됨 200 이런 식으로 알려줌
-> 이게 비동기적 방식임
모든 이메일 발송 처리를 다 하고 응답을 주는게 아니라
내가 큐에 넣어놨어! 라고 하면서 응답을 줌
그렇기에 훨씬 효율적임.
이래서 대규모 트래픽 처리에 유리함
메시지 큐에서는 프로듀서 서버가 보낸 메시지를 다 보관한다.
컨슈머 서버가 메시지를 꺼내서 처리한다.
그리고 이 메시지 큐가 여러개인데
이중 하나가 kafka
AWS 에 카프카 설치하기
1. jdk-17 설치하기 - 카프카 설치하려면 필수
sudo apt update
sudo apt install openjdk-17-jdk
2. kafka 설치 파일 다운
$ wget https://dlcdn.apache.org/kafka/4.0.0/kafka_2.13-4.0.0.tgz
tar -xzf kafka_2.13-4.0.0.tgz
이걸로 압축 풀기
압축 풀고 cd로 폴더로 이동하기
kafka가 쓰는 메모리 용량을 줄여야함
$ export KAFKA_HEAP_OPTS="-Xmx400m -Xms400m"
카프카 메모리를 400메가로 제한함
swap은 일부 디스크 공간을 메모리로 활용함
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16 # 2GB짜리의 파일 생성
$ sudo chmod 600 /swapfile # 파일에 권한 부여
$ sudo mkswap /swapfile # 2GB 짜리 파일을 swap 공간의 형태로 전환
$ sudo swapon /swapfile # swap 활성화

2기가 만큼의 파일을 swap 공간으로 활용
# 시스템 부팅 시마다 자동으로 활성화 되도록 파일시스템 수정
$ sudo vi /etc/fstab
# 아래 내용을 추가하고 저장하기
/swapfile swap swap defaults 0 0

아래처럼
free를 쳤을때, swap 메모리가 있으면 성공

이제 카프카설정을 수정하자
$ vi config/server.properties
내리다보면 advertised.listener 가 있는데
외부에서 카프카에 접근하는 주소를 뜻함

이렇게 자기 ip 주소를 적어 넣으면 된다.
그리고 초기 로그 폴더를 수정해야한다.
# 초기 로그 폴더 셋팅 (카프카 첫 실행 때만 이 명령어를 입력하면 됨)
$ KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
$ bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties
아래처럼 초기 로그 폴더를 세팅하자.

이런 로그 폴더가 있어야 카프카 실행이 됨
# 카프카 서버 실행
$ cd ~/kafka_2.13-4.0.0
$ bin/kafka-server-start.sh config/server.properties # 포그라운드에서 실행
# 백그라운드에서 실행
$ bin/kafka-server-start.sh -daemon config/server.properties
# 백그라운드에서 실행되고 있는 kafka 서버의 로그 확인하기
$ tail -f logs/kafkaServer.out
$ sudo lsof -i:9092 # 9092번 포트에서 실행 중인 프로세스 조회
# 카프카 종료하기
$ bin/kafka-server-stop.sh
# 잘 종료됐나 확인
$ sudo lsof -i:9092
kafka의 토픽
카프카에 들어온 메시지를 처리하기 위해 토픽을 사용
메시지의 종류를 구분하기 위해 사용함
프로듀서가 카프카에 메시지를 전달함
카프카는 메시지를 토픽별로 나눠서 저장함
컨슈머는 새로운 메시지가 있으면 조회해서 처리함.
프로듀서가 카프카에게 메시지 전달 방식을 미리 얘기함.
아 이렇게 저장해? -> 이렇게 저장할게
- 카프카는 그냥 하란대로 하는 거임
백엔드에서만 카프카를 조작하는게 아니다
cli 로도 조작할 수 있다.
토픽 생성하기
# kafka 디렉터리 안에서 아래 명령어를 실행시켜야 함
$ cd kafka_2.13-4.0.0
# 토픽 생성
# bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --create --topic <토픽명>
$ bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--create \
--topic email.send
email.send 라는 토픽을 만든다는 뜻임
# 토픽 전체 조회
# bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --list
$ bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--list
# 특정 토픽 세부 정보 조회
# bin/kafka-topics.sh --bootstrap-server <kakfa 주소> --describe --topic <토픽명>
$ bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--describe --topic email.send
# 토픽 삭제
# bin/kafka-topics.sh --bootstrap-server <kafka 주소> --delete --topic <토픽명>
$ bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--delete --topic email.send
# 잘 삭제됐는 지 확인하기
$ bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--list