# 1. 들어가며

> '아파치 카프카 애플리케이션 프로그래밍 with 자바 - 최원영' 통한 정리 및 실습

## 1.1 카프카의 탄생

![Before Kafka (https://bit.ly/3pIwdM8)](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FPd7gpYizREi23j5M05AE%2Fimage.png?alt=media\&token=fc9e0ae1-fb6b-496f-b616-763e0b9cbe8b)

![After Kafka (https://bit.ly/3pIwdM8)](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FGbh28rERDUSoREAzihU1%2Fimage.png?alt=media\&token=5eed2c28-bbe0-4db9-bb2d-3112ecd9dfb8)

거대해진 아키텍처의 데이터 파이프라인이 복잡해지기 시작.

링크드인에서는 복잡도를 낮추기 위해 신규 시스템을 개발 -> Apache Kafka

<details>

<summary>링크드인의 목표</summary>

1. 높은 처리량으로 실시간 처리한다.
2. 임의의 타이밍에 데이터를 읽는다.
3. 다양한 제품과 시스템에 쉽게 연동한다.
4. 메시지를 잃지 않는다.

</details>

![https://www.cloudkarafka.com/blog/2016-11-30-part1-kafka-for-beginners-what-is-apache-kafka.html](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2Fzxzvz7bod0DsG4SVbBej%2Fimage.png?alt=media\&token=4adf6f94-6d2a-4ce7-9469-1aba3e5eaf1b)

* 프로듀서(Producer) : 데이터를 생산 (push)
* 컨슈머(Consumer) : 데이터를 소비 (pull)

카프카 내부에 데이터가 저장되는 파티션의 동작은 FIFO 방식의 큐 자료구조와 유사.

카프카는 직렬화,역직렬화를 통해 ByteArray로 통신하기 때문에 데이터 포맷은 제한이 없다.

{% hint style="info" %}
KIP(Kafka Improvement Proposal)

카프카의 주요 변경사항을 제안하는 방법 중 하나로 누구나 생성할 수 있다.
{% endhint %}

## 1.2 빅데이터 파이프라인에서 카프카의 역할

* 데이터 레이크(data lake) : **필터링 되거나 패키지화가 되지 않은** 데이터가 모이는 저장 공간.\
  -> 운영하는 서비스로부터 수집 가능한 모든 데이터 수집.
* 데이터 파이프라인 : end-to-end를 개선하고 유연하면서 확장가능하게 자동화한 것

데이터를 data lake로 모으기 위해서는 복잡도가 올라가는 end-to-end 방식은 문제가 발생한다. 이에 데이터 파이프 라인을 구축해야 하는데 아파치 카프카가 매우 적합하다.

### 아파치 카프카의 적합성

#### 높은 처리량

* 데이터 배치 처리를 통해 네트워크 통신 횟수를 최소한으로 줄인다. (실시간 로그 데이터 처리에 적합)
* 파티션 단위를 통해 데이터 병렬 처리가 가능. (시간당 데이터 처리량 ↑)
* 파티션 개수만큼 컨슈머를 증가시키면 처리량 또한 증가한다.

#### 확장성

* 브로커 개수의 스케일 아웃(scale-out), 스케일 인(scale-in)

#### 영속성

* 페이지 캐시 메모리 영역을 사용.
* 한번 읽은 파일 내용을 메모리에 저장 시켰다가 다시 사용하는 방식
* 파일 시스템을 활용한 덕분에 프로세스 재시작에도 영속성이 보장.

#### 고가용성

* 데이터의 복제(replication)을 통한 특징이다.

{% hint style="success" %}
3대 이상의 브로커로 구성하는 이유

데이터 유실의 가능성을 막기 위해 min.insync.replica의 옵션을 사용하는 경우

(isr은 2이상으로 설정해야 의미가 존재)

2대의 브로커라면, 장애에 대응할 수 없다.
{% endhint %}

{% hint style="info" %}
**고가용성**

서버와 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질을 말한다. **고**(高)**가용성**이란 "**가용성**이 높다"는 뜻으로서, "절대 고장 나지 않음"을 의미<br>

#### 온프레미스(on-premise)

자체적으로 보유한 공간에 물리적으로 하드웨어 장비를 가지고 직접 운영하는 방식
{% endhint %}

## 1.3 데이터 레이크 아키텍처와 카프카의 미래

데이터 레이크를 구성하는 람다 아키텍처와 카파 아키텍처가 존재.&#x20;

해당 아키텍처들의 구성 중 하나인 스피드 레이어는 내결함성과 장애허용 특징을 지녀야한다. 이에 카프카가 완벽히 부합한다.

* SPOF : 전체 시스템의 작동을 멈춰 버리는 한 부분 (ex: router)
* 내결함성 : 진행 중이던 작업이나 데이터가 돌발 상황에 손상되지 않도록 대비.
* 장애 허용 : 결함 or 고장 발생 시에도 정상적 혹은 부분적으로 기능을 수행 가능한 것.
