개발 잘 하고 싶다 => 알고 쓰자/Kafka

빵년 차 주니어가 공부하는 Kafka

장 상 현 2022. 7. 28.
 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

Official Document

 

빵년 차 주니어답게 틀린 내용이 산재할 확률이 대단히 높습니다. 댓글에 날카로운 조언 미리 감사드립니다.

 

Kafka 가 무엇이냐?

 

결론부터 말하자면

 

Message Queue Database

 

근데, Queue는 뭘까?

 

Queue (abstract data type) - Wikipedia

Abstract data type QueueAlgorithm Average Worst caseSpace O(n) O(n)Search O(n) O(n)Insert O(1) O(1)Delete O(1) O(1) Representation of a FIFO (first in, first out) queue In computer science, a queue is a collection of entities that are maintained in a seque

en.wikipedia.org

Queue 가 무엇인지 알았다 (정말?)

 

 

그러니까, Kafka (Message Queue)는 왜 사용할까?

 

첫째, 메시지의 안정적인 통신을 위해

한국에 있는 A 서버가

 

미국에 있는 B 서버에게 메시지를 보내고 있다

 

근데 상어가 해저 케이블을 갉아먹었어 앙대

 

인터넷이 끊겼어!

 

근데 자꾸 메시지를 보내

 

그럼 그 통신 내용은 어디로 가...?

 

어디 가지 않게 중간에서 보관하자!

 

근데, 순서대로 보관할 필요가 있으니까 Queue로 저장하자!

 

그래서, 중간 다리 역할을 하는 Message Queue 시스템 중 하나인 Kafka를 사용한다!

 

둘째, 대량의 메시지를 안정적으로 처리하기 위해

 

만약 우리가, 초당 메시지가 수만 개는 우스운 수준의 거대한 서비스를 운영하는 회사에 다닌다면?

 

대량의 부하를 견디지 못하고 서버가 터져! (누락이라고도 해야 할까...? Network의 정확한 동작을 공부 후 보완하겠습니다)

 

아무튼 몹시 곤란하다 이거야!

 

그래서, 대량으로 발생하는 메시지를 Kafka(Message Queue)에 넣고

 

그 Kafka는 파티션을 "상황에 맞게 적절"하게 (AWS의 MSK를 사용한다면, CloudWatch 지표를 보고 판단할 수 있다)

 

늘려서 분산 처리를 하게 하자!

 

그럼 여기서, 분산은 어떻게 해?

 

Kafka의 KEY라는 걸 지정할 수 있는데,

 

Key를 지정하지 않았다면 Round Robin으로 자동 분산

 

지정했다면 그 Key는 최초로 할당된 파티션에만 보내져 offset을 보장할 수 있다!

 

Round Robin

 

Round-robin scheduling - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Algorithm employed by process and network schedulers in computing A Round Robin preemptive scheduling example with quantum=3 Round-robin (RR) is one of the algorithms employed by proce

en.wikipedia.org

Offset = consumer가 메시지를 어디까지 읽었는지에 대한 값 = 간단하게 "순서"

 

Offset (computer science) - Wikipedia

Integer indicating the distance from an object's start to a specific element in it In computer science, an offset within an array or other data structure object is an integer indicating the distance (displacement) between the beginning of the object and a

en.wikipedia.org

 

그렇다면, 그 Key는 어떻게 설정하는 게 좋아요?

 

일반적으로는 Primary Key = Uniqe 한 값을 사용한다

 

왜?

 

그 데이터 내에서 유일 불변의 값이어야 식별의 무결성을 보장할 수 있으니까!

 

예를 들어

 

1. Key를 지정하지 않았을 때는 Key가 디폴트 값인 테이블 네임으로 저장되는데

 

2. 사용하는 Database가 RDB라 가정하고, 데이터베이스 정규화에 따른 테이블들로 구성되어 있을 때

 

3. Products 테이블의 변경이 수백 건 일어날 때 Product_hashtag 같은 테이블의 변경사항은 한 건

 

그렇다고 하면 

 

Products 테이블명이 할당된 파티션에는 메시지가 수백 건 일 때

 

Product_hashtag 테이블명이 할당된 파티션은 메시지가 한두 개

 

이거는 몹시 불편하지 않은가!?

 

그렇기 때문에 product_id 같은 Primary Key를

 

Kafka의 Key로 설정하여 사용한다!

 

 


 

여기까지가

 

22.07.28 의 지식수준

 

공부 중

 

Kafka Topic Naming Conventions

 

Kafka Topic Naming Conventions

Today, I'll be tackling the controversial subject of Kafka topic names. Not only will I review various schemes, but I've decided to take a stand on a few issues and outline my reasoning. Get out your

cnr.sh

 

Kafka Producer ACKS

 

Kafka 운영자가 말하는 Producer ACKS | Popit

이번에는 메시지를 보내는 프로듀서에 대해 설명하도록 하겠습니다. 프로듀서가 메시지를 보낼때, 몇가지의 옵션들을 선택하여 보낼 수 있습니다. 프로듀서의 여러가지 옵션들중에서, 저는 가

www.popit.kr

 

 
 

댓글