오픈소스 Kafka에 대한 분석내용이다.
Pub-Sub 모델의 고성능 분산 메시징 플랫폼
Linkedin에서 만들어져서 2011년 아파치 재단의 오픈소스로 공개
대용량 실시간 로그처리에 특화되어 설계된 메세징 시스템
메세지를 디스크에 저장
간단한 Scale out 및 무중단 서비스
Kafka를 구성하는 각 서버
Data가 저장되는 곳
Kafka에 저장되는 메세지는 Topic으로 분류됨
Topic은 여러개의 파티션으로 나눠질 수 있고 Kafka Cluster는 각 파티션을 관리한다.
Topic내에서 메세지가 분산되어 저장되는 단위
한 Topic에 Partition이 6개 있다면 6개의 Partition에 대해 메세지가 분산되어 저장
Partition안에 메세지의 상대적 위치를 나타내는 Offset Id가 할당
동시에 들어오는 많은 데이터를 여러개의 파티션에 나누어 저장하기 때문에 병렬로 빠르게 처리할 수 있다.
Broker에 데이터를 write하는 역할
데이터를 특정 토픽(Topic)으로 전송
Broker에서 데이터를 read하는 역할
Consumer의 묶음 단위(n consumers)
Topic에 대한 Offset은 Consumer Group 단위로 구분
Kafka를 운용하기 위한 Coordination service
클러스터의 설정 정보, 동기화, 리더 채택등 클러스터의 서버들이 공유하는 데이터를 관리하기 위해 사용
Producer는 1개 이상의 Partition에 나뉘어 데이터를 Write함
Consumer는 Partition단위로 데이터를 병렬로 읽을 수 있음
Replication 수를 지정하여 Topic을 만들수 있음
Leader/Follower Partition
ACKS 설정
C/C++
Python
Go (AKA golang)
Erlang
.NET
Clojure
Ruby
Node.js
Proxy (HTTP REST, etc)
Perl
stdin/stdout
PHP
Rust
Alternative Java
Storm
Scala DSL
Clojure
Swift
Kafka에서 사용가능한 스트리밍 SQL 엔진, KSQL Server 필요
SQL문법으로 Real time application을 작성할 수 있음(ex. Streaming ETL, Anomaly Detection, Monitoring)
Library로서 Java나 Scala로 Real time application을 작성할 수 있음
import org.apache.kafka.streams.scala.Serdes._
import org.apache.kafka.streams.scala.ImplicitConversions._
.....
val builder = new StreamsBuilder()
val textLines: KStream[String, String] = builder.stream[String, String]("streams-plaintext-input")
val wordCounts: KTable[String, Long] = textLines
.flatMapValues(textLine => textLine.toLowerCase.split("\\W+"))
.groupBy((_, word) => word)
.count()
wordCounts.toStream.to("streams-wordcount-output")
....
참고
https://www.confluent.io/blog/using-apache-kafka-drive-cutting-edge-machine-learning/#model-deployment
https://victorydntmd.tistory.com/344
https://www.popit.kr/kafka-consumer-group/
https://zzsza.github.io/data/2018/06/15/apache-kafka-intro/
https://blog.voidmainvoid.net/179
https://engkimbs.tistory.com/691
https://www.confluent.io/blog/ksql-streaming-sql-for-apache-kafka/