일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 컬렉션 프레임워크
- 멱등성
- 오버라이딩
- 지연로딩
- jsoup
- 변수와 상수
- 프로그래머스 코테
- exclusive lock
- 프로그래머스
- 원시타입
- 추상메서드
- 참조타입
- InterruptedException
- Shared Lock
- git 기초
- 즉시로딩
- select
- 피연산자
- 오버로딩
- foreigen key
- 연산자와의 관계
- N+1
- SQL
- null/not null
- delete
- Java
- 메세지 큐
- bufferedInputStream
- 서버 스크립트
- 변수와 메서드
- Today
- Total
[JAVA_Back-End]
[Kafka] Apache Kafka에 대해서 알아보자 본문
Kafka를 알기 전에는 MQ(Message Queue)를 알아야 한다..!
메시지 큐(MQ)
- 비동기 메시지를 사용하는 다른 응용프로그램 사이의 데이터 송수신을 의미하는데 MOM을 구현한 시스템 => MQ(메세지 큐)
- * 메시지 지향 미들웨어(Message Oriented Middleware: MOM)
- Producer가 메시지를 큐에 전송하면 Consumer가 처리하는 방식
- 메시지를 비동기로 처리하고 queue에 저장하기 때문에 consumer에게 병목을 줄여줄 수 있는 장점이 있음
Kafka 란?
- 분산형 스트리밍 플랫폼
- 메시지를 메모리에 저장하는 메시징 시스템과는 달리 파일에 저장을 하기 때문에 카프카를 재시작해도 메시지 유실 우려가 감소된다.
- 브로커가 컨슈머에게 메시지를 push해주는 방식이 기본 메시징 시스템이라면, 카프카는 컨슈머가 브로커로부터 메시지를 직접 가져가는 pull방식으로 동작 (따라서 컨슈머는 자신의 처리 능력만큼의 메시지만 가져와 최적의 성능을 낼 수 있음)
- 하드디스크의 순차적 읽기에 대한 성능은 메모리보다 크게 떨어지지 않는다. (카프카의 파일 시스템을 활용한 고성능 디자인에 근거)
kafka라는게 어떤 기술인지는 어느정도 알겠다... 그럼 왜 사용하는가?
1. 발신자와 수신자 서로가 서로에게 의존하지 않음
2. 수신자가 장애 상황이 와도 발행된 메세지가 큐에 남아있기 때문에 수신자에게 특별한 이슈가 있지 않은 이상 무조건 메세지가 전달됨
3. 비동기 통신을 구현할 수 있는 점이 가장 메리트가 있음(높은 처리량, 낮은 지연시간)
Kafka 실제로 사용해보기
[ kafka 명령어 ]
* 각 명령어의 경로(./bin~)는 카프카 설치 경로에 따라 다를 수 있음
- 토픽 목록 확인
$ ./bin/kafka-topics.sh —bootstrap-server localhost:9092 --list
(* 9092는 카프카의 default port이다.)
- 토픽 정보 확인
$ ./bin/kafka-topics.sh --describe —topic [확인할 topic 이름] —bootstrap-server localhost:9092
- 토픽 생성
$ ./bin/kafka-topics.sh --create --topic <topic-name> --bootstrap-server <broker-list> [--replication-factor <replication-factor>] [--partitions <num-partitions>]
ex) ./bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --replication-factor 1
- 토픽 삭제
$ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic 토픽이름
!!! topic이 delete되지 않는다면? !!!
-> server.properties에 delete.topic.enable = true 옵션을 추가해주세요..
(* server.properties는 높은 확률로 /opt/kafka/bin안에 있을 것임)
그래도 안된다면...
- kafka cluster의 로그폴더 내용을 삭제 후 재시작합니다.
- --delete뒤에 --force명령어를 추가 입력하면 지워진 토픽정보를 복구하지 않고 delete됩니당
- producer 실행 (데이터 입력)
$ ./bin/kafka-console-producer.sh --topic 토픽이름 —broker-list localhost:9092
또 다른 터미널 실행 후...
- consumer 실행
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic 토픽이름 --from-beginning
이제 메세지를 보내보세용
그러면 바로바로 메세지가 뜨게 된답니다~!
kafka 메시지 삭제 정책
"Kafka는 메세지를 큐에 넣는데 그럼 삭제는 못하나요..??"
- kafka는 파티션에 데이터를 저장함
- 카프카를 설정하면 파티션이 저장될 디렉토리의 위치를 log.dirs 매개변수에 지정할 수 있음
- 다른 메시징 시스템과 달리 토픽의 메시지가 소비된 후 즉시 삭제하지 않음
- 각 토픽의 구성에 따라 허용되는 공간과 관리 방식이 결정된다.
- 특정 오프셋이나 설정된 byte가 넘어가면 새로운 segment가 생성되어 메시지가 관리된다.
- 시간기반, 크기기반으로 오래된 세그먼트를 삭제한다.
- 시간 기반 보유: Segments에 대해 retention time에 도달하면 정의된 정책에 따라 segments가 삭제 또는 압축 대상으로 표시된다. (기본 보존 기간은 7일)
-> retention.hours, minutes, ms 등으로 런타임에서 값을 수정할 수 있음
- 크기 기반 보유: 토픽 파티션에 대한 로그 데이터 구조의 최대 크기를 설정할 수 있음. 로그의 크기가 설정에 도달하면 마지막부터 세그먼트 제거
-> 디스크 공간이 제한되는 상황에서는 유용(세그먼트가 하나밖에 없는 경우에는 정상적으로 삭제되지 않을 수 있음)
=> 나는 그냥 토픽을 삭제하고 다시 생성하는 방식으로 진행했다. (어차피 나중되면 사라질 내용..그냥 지금 삭제한다 생각하고...ㅎ)
Kafka를 spring에 녹여낸 내용은 다음에 포스팅하도록 하겠다,,,,