티스토리 뷰
Backend로 이동하고 나서 제가 했던 시스템들의 구성들에 대해서 생각하게 되었습니다.
단순하게 코딩을 하는 문제는 너무 쉬운 문제였기 때문에 이것들이 어떻게 되어 있고 어떠한 역사를 가지는지에 대해서 알고 싶었고 그것을 조금 정리해보고 싶었습니다. 틀린점 있으면 댓글 남겨주세요 ^^
1. 역사
- 2011년 LinkedIn에서 개발된 분산 메시징 시스템으로 오픈소스로 공개되었음.
- 대용량의 실시간 로그처리에 특화된 아키텍쳐 설계를 통하여 기존 메시지 시스템보다 우수한 TPS를 보여줍니다.
2. 기본 구성
- 발행과 구독의 publish-subscribe 모델을 기반으로 동작하게 되며 producer, consumer, broker로 구성됩니다.
- Kafka의 broker는 topic을 기준으로 메시지를 관리하게 되는데, Producer는 특정 topic의 메시지를 생성하고 해당 메시지를 Broker에 전달합니다. Broker가 전달받은 메시지를 topic 별로 분류하고 쌓아 놓으면 해당 topic을 구독하는 Consumer들이 메시지를 가져가서 처리하게 되는 방식입니다.
- Kafka는 scale-out(확장성) 과 high available(고가용성) 을 위하여 Broker 들이 클러스터로 구성되어 동작하도록 설계되어 있고 심지어 Broker가 1개 밖에 없을 때에도 클러스터로써 동작을 하게 되어 있습니다. 클러스터 내의 Broker에 대한 분산 처리는 ZooKeeper가 담당합니다.
3. 기존 시스템과의 차이
- 기존에 있던 시스템은 제가 잘 모르기는 하지만 이것도 공부를 해야할거 같네요. 할거 너무 많아서 좋음. 일단 기존 시스템은 ActiveMQ, RabbitMQ 같은것들이 있을거 같습니다.
- 대용량 실시간 로그 처리에 특화되게 설계가 되어 있습니다. 그래서 기존 범용 메시지 시스템 대비 TPS가 매우 우수하다고 하고요. 단, 특화된 시스템이기 때문에 범용 메시지 시스템에서 제공하는 다양한 기능은 없다고 합니다. ( 나중에 RabbitMQ는 또 정리 해야겠네요. ㅎㅎ )
- 분산 시스템을 기본으로 설계가 되었기 때문에 기존에 비해 분산 및 복제 구성을 손쉽게 할 수 있는것이 장점
- AMQP프로토콜이나 JMS API를 사용하지 않고 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜을 사용하여 프로토콜에 의한 오버헤드를 감소
- Producer가 Broker에게 다수의 메시지를 전송할 때 각 메시지를 개별적으로 전송해야하는 기존 메시징 시스템과는 달리 다수의 메시지를 batch 형태로 Broker에게 한 번에 전달하는것이 가능하여 TCP/IP 라운드 트립 횟수를 줄여버림.
- 메세지를 기본적으로는 파일 시스템에 저장한다. 고 하는데 여기서 의문이 잠시 생기기는 하겠지만 아래에 설명이 있음. 중요한것은 기존 시스템은 메모리를 이용함
- 파일 시스템에 저장하기 때문에 별도의 설정을 하지 않아도 durability(데이터 영속성)이 보장됩니다.
- 기존 시스템은 처리되지 않고 남아 있는 메시지의 숫자가 많을수록 시스템의 성능이 크게 감소하게 되었는데, Kafka에서는 메시지를 파일 시스템에 저장하기 때문에 메시지를 많이 쌓아두어도 성능이 크게 감소하지 않는다고 합니다. 아마도 그럴것이 디스크가 가득 차버릴 정도로 쏟아부으면 당연히 성능이 떨어질것 같긴하네요.
- 이러한 용도로 인하여 많은 메시지를 쌓아둘 수 있어서 주기적인 batch 작업에 사용 할 데이터를 쌓아두는 용도로 사용이 가능하다고 합니다.
- 또한 Consumer에 의해서 처리가 되면 바로 삭제하는 기존 메시징하고는 다르게 일정기간동안 데이터를 둘수 있는 장점도 존재하게 됩니다. 그래서 메시지 처리 도중 문제가 발생하였거나 처리 로직이 변경되었을 경우 Consumer가 메시지를 처음부터 다시 처리 할 수 있는 장점이 있습니다.
'Backend > Kafka' 카테고리의 다른 글
Kafka의 Topic과 Partition (0) | 2019.12.07 |
---|
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- rxswift
- intellij
- Windows
- enum
- ios
- Gradle
- CentOS
- war
- Codable
- Linux
- SWIFT
- Python
- nodejs
- windows10
- Spring
- MySQL
- cocoapods
- golang
- tomcat
- Xcode
- Java
- go
- git
- ubuntu
- php
- github
- Kotlin
- centos8
- docker
- android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함