빵년 차 주니어가 공부하는 Kafka
Official Document
빵년 차 주니어답게 틀린 내용이 산재할 확률이 대단히 높습니다. 댓글에 날카로운 조언 미리 감사드립니다.
Kafka 가 무엇이냐?
결론부터 말하자면
Message Queue Database
근데, Queue는 뭘까?
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
Offset = consumer가 메시지를 어디까지 읽었는지에 대한 값 = 간단하게 "순서"
그렇다면, 그 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 Producer ACKS
댓글