분산시스템
카프카는 여러 브로커들을 묶은 분산 클러스터 디자인이다
- 단일 시스템보다 향상된 성능 제공
- 몇몇 브로커에 문제가 생겨도 다른 브로커가 대신 처리 가능
- 시스템 확장이 용이
파일시스템 (디스크캐싱)
카프카는 메시지 저장과 캐싱을 위해 파일시스템에 크게 의존한다. 일반적으로 "디스크는 느리다"는 인식때문에 영속적인(persistent) 구조가 성능에 좋지 않은 영향을 줄 것이라고 생각하지만, 카프카에서는 성능을 희생하지 않으면서 영속적인 구조를 제공한다.
- 디스크의 탐색속도는 지난 10년동안 개선되어왔다. (RAID 등..)
- 선형 읽기/쓰기는 운영체제에 의해 최적화된다.
- 현재 운영체제는 미리 읽기(read-ahead)와 Write-behind 등의 최적화를 수행
- (순차 디스크 접근은 랜덤 메모리 접근보다 빠를수도 있다...는 ACM Queue article이 있음)
- 디스크 성능 이슈를 보완하기 위해 현대 운영체제는 메모리에 디스크 캐싱을 사용하여 성능을 적극적으로 개선하였다.
- 페이지 캐시를 사용하여 디스크를 이용하면서도 성능 불이익 없이 영속성을 제공한다.
배치 처리와 압축
I/O 작업이 빈번하게 실행되면 성능 저하를 유발하기 때문에, 카프카에서는 여러 작업을 묶어서 배치처리를 하여 성능을 개선하였다.
또한 네트워크 비용을 낮추기 위해 카프카는 전송되는 메시지에 대해 GZIP 등의 다양한 압축 프로토콜을 제공한다.
효율성
바이트복사 작업의 비효율성을 피하기 위해서 프로듀서, 브로커, 컨슈머는 통일화된 바이너리 메시지 포맷을 사용한다.
- 그래서 데이터 청크의 변환 없이 바로 전송이 가능하다
- 현대 유닉스 운영체제는 pagecache에 있는 데이터를 socket으로 전송하기 위해 고도로 최적화된 동작은 제공한다.(리눅스의 sendfile과 같은 시스템콜)
일반적으로 디스크에 있는 데이터를 소켓으로 보내기 위해서는 다음과 같은 비효율적인 과정을 거친다.
- 운영체제가 disk의 데이터를 커널영역의 pagecache로 읽어들임
- 어플리케이션이 커널영역에 있는 데이터를 유저영역으로 읽어들임