대규모 프로젝트에 사용하는 각 서비스들의 통신 방법 중에 대표적인 사례로 kafka가 있다. 해당 기술에 대한 개념과 실습 예제로 간단히 작성하고자 한다.
# compose 파일 버전
version: '3'
services:
# 서비스 명
zookeeper:
# 사용할 이미지
image: wurstmeister/zookeeper
# 컨테이너명 설정
container_name: zookeeper
# 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
ports:
- "2181:2181"
# 서비스 명
kafka:
# 사용할 이미지
image: wurstmeister/kafka
# 컨테이너명 설정
container_name: kafka
# 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
ports:
- "9092:9092"
# 환경 변수 설정
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_CREATE_TOPICS: "Topic:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# 볼륨 설정
volumes:
- /var/run/docker.sock
# 의존 관계 설정
depends_on:
- zookeeper
ZooKeeper로 kafka 클러스터를 관리해줘야 하기 때문에 docker-compose로 실행함으로써 네트워크를 연결한다.
카프카에서는 각 메시지들을 여러 개로 복제해서 클러스터 내 브로커들에 분산 시키는 동작을 한다.
그래서 하나의 브로커가 종료되더라도 나머지가 살아있기 때문에 안정성을 유지할 수 있다.
factor 값이 클수록 실행되는 파티션이 많으므로 안정성은 증가한다.
당연히 그만큼 리소스를 많이 사용하므로 오버헤드를 고려해야 한다.
factor 수를 정하는 기준을 나름대로 정리해 보면,
테스트 or 개발 환경: 1개
운영 환경(log 관련 메시지로 약간의 유실 허용): 2개
운영 환경(유실 허용하지 않음): 3개
그 이상도 사용할 수 있지만 일반적으로 3까지만 사용해도 충분하다고 한다.
기본적으로 토픽 하나당 하나의 처리만 가능하다. 그래서 토픽 하나를 파티션으로 여러개 나눔으로써 병렬 처리를 가능하도록 해주는 것이다. 그래서 분산 처리도 가능하게 한다.
파티션 수도 직접 설정할 수 있다. 파티션을 정하는 기준은 어느정도 공식이 존재한다고 하지만 메시지 크기 또는 초당 메시지 건수에 따라 달라지는 조건도 고려해야 한다.
프로듀서를 이용해 보낸 메시지는 토픽의 파티션에 저장된다. 그리고 Segment라는 log파일 형태로 브로커의 로컬 디스크에 저장된다.
예시
kafka 컨테이너로 접근 후에 kafka log 폴더로 이동
ls 로 디렉토리 확인후 cd로 해당 디렉토리로 이동
해당 디렉토리 확인
offset이 아닌 설정한 “토픽이름-0” 디렉토리로 이동(예시:rooms-0)
ls 출력: 해당 디렉토리는 rooms라는 토픽의 0번 파티션 디렉토리를 나타낸다.
xxd 명령어로 해당 log파일 출력(없으면 xxd 설치)
해당 출력 오른쪽에 보면 kafka를 통해 통신했던 메시지들이 기록되어 있다.