-
Kafka 기본 개념MSA/Kubernetes 2023. 2. 8. 20:19
Kafka
아파치 재단의 카프카는 pub-sub모델의 메세지 큐이고, 분산환경에 특화되어 설계되어 있다는 특징을 가짐으로써, 기존의 RabbitMQ와 같은 다른 메세지큐와의 성능 차이가 난다(훨씬 빠르게 처리한다). 그 외에도 클러스터 구성, fail-over, replication와 같은 여러 가지 특징들을 가지고 있다.
용어
Event(Message) : 데이터 단위
Producer : Event를 게시하는 클라이언트 어플리케이션
Consumer : Topic 을 읽고 해당 Event를 처리하는 클라이언트 어플리케이션
Topic : Event 가 적재되는 곳
Partition : Topic 은 여러 Broker 에 분산저장되며, 분산된 Topic 을 Partition 이라고 한다. 어떤 Partition 에 저장될지는 Key 에 따라 정해진다.Partition

병렬처리 지원을 위한 Partition 생성이 주 목적이다.
단, 증가시킨 Parition은 운영 중 축소할 수 없기 때문에 주의해야 한다.
Partition 은 RoundRobin으로 동작함에 따라서 이벤트의 순위가 중요하면 사용하지 않아야한다.
결과적으로, 순차적인 처리를 위해서는 하나의 Topic 에 하나의 Partition 만 설정하거나 Partition 별로 지정된 Event 로 분류될 수 있어야 할것이다.
Producer
Kafka Client Library 를 사용하여 작성된 Event를 Send 하는 Application 을 의미한다.
하나의 Topic에 다수개의 Partition 이 존재하는 경우, 필요에 따라서 특정 Parition 에 Event 를 전달할 수 있다.
전달방식에는 Sync , Async 방식을 사용 할 수 있으며, Async 시 Batch 형식을 사용하여 일정 주기간격으로 Event 를 Kafka Server 에 전달한다.
Consumer
Kafka Client Library 를 사용하여 작성된 Event를 Get 하는 Application 을 의미한다.
하나의 Topic에 다수개의 Partition 이 존재하는 경우, 필요에 따라서 특정 Parition 에 Event 를 가져올 수 있다.
AutoCommit 와 수동 Commit 이 존재하며, Consumer 가 Kafka Server 에서 Event 를 가져갈 경우 다음 Event 로 offset을 자동으로 변경해주는 기능이 AutoCommit 이며, 이를 필요에 따라서 Off 후 Consumer가 직접 Commit 할 수 있다.
Partition 당 Consumer 는 1개이기 때문에 처리중에 다음번 Event 가 진행되지 않는다.
정확한 AutoEmmit 시점은 보다 리서치를 해봐야할듯하다.
Broker
카프카 서버를 의미한다. broker.id 를 변경함에 따라서 여러개의 서버데몬을 띄울 수 있다.
zookeeper
분산 메시지 큐의 정보를 관리해주는 역활을 한다. Broker 실행시 무조건 zookeeper 가 실행되어야 한다.
Replication Factor
자가 복제는 수평적인 Scale Out 이다. Leader(Primary) 와 Follwer(Secondary) 로 구분된다.
Cluster 구성시 활용가능하며, Topic 에 대한 Replica 수량 지정을 통해 동작한다.

Message Delivery Guarantees
At-most once
최대 n번 전달시도하는 동작
At-least-once
최소 1회 이상의 메시지를 보장한다.
Exactly-once
카프카 클러스터에 두번이상 데이터가 저장될 수 있습니다. 데이터가 클러스터에 저장되었으나 ack가 유실되어 프로듀서가 재처리하는 경우가 대표적입니다.
결과적으로 카프카 트랜잭션 처리를 하더라도 컨슈머가 중복해서 데이터 처리하는 것에 대해 보장하지 않으므로, 컨슈머의 중복처리는 따로 로직을 작성해야합니다.
idempotent (멱등성)
즉, 한번만 보내는 것을 의미하는 것이 아닌, 여러번 수행해도 다른 효과를 발생시키지 않는 연산을 의미함
Kafka에 비유하면 producer가 retry에 의해 같은 메세지를 여러번 보내더라도, kafka log에는 한번만 기록된다는 뜻이다
send할 때, 해당 메세지에 대해 seqNo만 부여해서 처리, seqNo만 추가한거라서, 사실상 오버헤드는 거의 없다고 한다.
enable.idempotence = true
transaction.id Not Set !Procuder 별로 동작되며 재구동시 유효하지 않음.
atomic Transaction
여러 Topic-Partitions 에서 Exactly-Once 처리를 보장 하고 생산자가 여러 번 다시 시작되는 경우에도 여러 생산자 세션 에서 Exactly-Once Processing을 지원합니다 .
Consumer 가 Emmit 하는 경우를 의미
중복데이터에 대한 처리방안
- 고유한 키를 지원하는 외부 시스템에 식별 데이터를 쓰는 것. RDBMS나 엘라스틱서치 등의 시스템을 사용할 수 있다.
- 레코드 자체에 고유한 키를 포함하거나 토픽,파티션,오프셋을 조합하여 고유한 키를 생성하고, 이 식별 데이터를 외부 시스템에 쓴다
- 프로듀서는 레코드를 쓰거나 컨슈머에서 읽을 때 확인하여 레코드 중복을 방지할 수 있다. = 멱등성(idempotent) 라고 한다
'MSA > Kubernetes' 카테고리의 다른 글
Kubernetes 개요 (0) 2023.02.15 Kafka Consumer Group 및 Rebalancing (0) 2023.02.10 Kafka 설치 (0) 2023.02.10 Kafka Connector (0) 2023.02.09 Helm Chart (0) 2023.02.02