[Kafka - step 6] 카프카 실제 사용 예시 (consumer, kafka, producer연동) (stream, 분산 큐잉, 데이터 허브)
현재 카프카 정리 시리즈를 포스팅 하고 있다.
카프카 정리 시리즈에서 다루는 여러가지 주제가 궁금할 경우 본 글 을 참고하길 바란다.
앞서 카프카의 프로듀서와 컨슈머가 무엇인지 그리고 그들의 동작방식에 대해 이론적으로 알아보았다.
본 글에서는 카프카를 그래서 어디에 쓰는데?, 프로듀서와 컨슈머가 서로 어떻게 동작하는데?와 같은 질문에 답하려고 한다.
Kafka의 사용 목적을 읽다보면, 왜인지는 알겠으나 구체적으로 어떤 형태로 활용되는지에 대해 감이 통 잡히지 않았다. 따라서 Kafka를 사용하는 이유를 크게 세가지로 나누어보고 각 이유별로 예시를 들어 설명하려고 한다.
Kafka를 사용하는 이유를 크게 나누면 아래 세 가지를 꼽을 수 있다.
- 분산 큐잉 시스템으로 활용
- 데이터 허브
- Response가 필요 없는 액션들에 대한 데이터 처리
분산 큐잉 시스템으로 활용
카프카를 분산 큐잉 시스템으로 활용하여 어떤 서비스의 웹 어플리케이션 서버에서 처리하는 자원을 많이 사용해야 하는 업무가 발생했을 때 이르 내부에서 처리하지 않고 다른 프로세스에서 작동중인 백그라운드 태스크 프로세서에 요청하기 위한 큐로 사용할 수 있다.
예를 들어 IoT장비의 센서가 생성하는 데이터를 분석해야 한다고 했을 때, 장비에서 모두 처리하게 되면 오버헤드로 인해 데이터 생성 자체가 어려울 수 있다. 따라서 데이터만 생성하고 분석 작업은 다른 어플리케이션이 처리할 수 있도록, IoT장비(Producer)가 구독하고 있는 토픽에 메시지를 전송하고, 분석 어플리케이션(Consumer)는 해당 토픽에서 데이터를 가져와 분석을 처리할 수 있다.
데이터 허브로 사용
이 방법은 어떤 서비스에 데이터 업데이트가 발생했을 때, 해당 데이터를 사용하는 다른 여러 서비스에 전파하기 위한 허브로 사용한다. 각 서비스가 전파받아 처리한다는 점에서 분산 큐잉 시스템과 비슷하지만 ‘여러 서비스에 전파하는 허브로서의 기능’에 초점을 두자.
구체적인 예를 들어보면 LINE에서는 사용자의 친구 관계를 데이터로 저장하고 있다고 한다. 예를 들어 아래 그림과 같이 어떤 사용자 A가 다른 사용자 B를 친구로 추가했을 때, LINE 내부에서는 그에 따른 처리를 수행하고 업데이트된 관계를 Kafka의 topic에 이벤트로 입력한다고 한다.
위 사례에서 특징은 Response가 필요 없는 액션들에 대한 데이터 처리를 카프카를 통해서 한다는 점이다. 유저의 애플리케이션의 활동을 기록을 해서 분석을 하고 처리하기 위해 필요하지, 유저에게 방금 활동을 기록했다든지 어떤 분석을 했다든지 등의 response는 필요하지 않다.
Stream Processing
세 번째는 Stream Processing 시스템이다. stream processing이란 데이터를 그냥 전달하는데 그치지 않고, 데이터를 실시간으로 처리하고, 데이터에 대한 filter, join, map, aggregation과 같은 처리해 전달하는것을 의미한다. 이에 따라 데이터베이스는 전처리가 되지않은 내용들을 처리할 필요가 없어진다.
예를 들어 뉴스 기사에서 유의미한 데이터를 추출하는 데이터 분석 파이프라인을 구성하는 예시로 설명해보겠다.
특정 document(뉴스 기사)가 있을때 데이터를
- 실시간 stream processing하고
- 여러 어플리케이션이 이 document를 전처리하고
- Elastic Search에 전처리된 데이터를 저장하는 파이프라인을 한번 구성해보자.
stream 처리를 하는 과정에서
- 관련 유명 인사가 누군지
- 어느 뉴스 회사에서 작성했는지
- 관련 토픽은 무엇이 있는지
를 추출하고 이 데이터를 나중에 관련 유명인사, 뉴스 회사, 그리고 관련 주제의 상관관계를 분석하는 모델에 활용한다.
이렇게 데이터를 처리하기 위해서는 각 뉴스 기사들에 대해 다음의 전처리가 필요하다
- Filter : 특정 criteria에 맞지 않는 뉴스 기사는 버린다. 예를 들어 empty document나 언어가 맞지 않는다든지 등
- Deduplicate : 중복된 뉴스 기사는 제외한다
- Entity Linkage : 뉴스 기사내에 나오는 이름이나 회사를 마킹한다. (분석에 활용)
- Keyword Extraction : 뉴스 기사의 키워드를 추출해서 관련 토픽을 찾아낸다 (분석에 활용)
그리고 이 전처리는 아래처럼 실행가능하다.
위 그림에서 Streaming Soruce (Producer only), Elastic(Consumer only)를 제외하고는 각 컴포넌트에 모두 consumer, kafka, producer가 붙는다.
쉽게 말해서
각 컴포넌트마다 이렇게 붙어서 데이터가 stream형태로 처리가 되는 것이다.
카프카는 여러 컨슈머를 통한 분산처리가 가능하기 때문에, 이러한 stream operation을 빠르게 처리할 수 있다. 이런 디자인 패턴을 분산처리와 안정성을 제공하는 카프카에 활용하는 경우가 많으니 참고하길 바란다
정리
즉 정리해보면 위에 설명한 사용 사례에서 보이듯 많은 서비스들이 큰 규모의 클러스터를 독립적인 여러 서비스와 시스템에서 공통적으로 사용하고 있고, 아래와 같은 Use case들에도 활용된다고 하니 참고 바란다.
Messaging
- Message broker로 사용 : pub - sub 모델
Real Time data processing
- stream processing이 가능하기 때문에 이를 활용해 데이터를 처리하고 분석에 활용
- 예: 실시간 데이터 분석 / 금융에서 fradulent transaction 블로킹 등
Application Activity Tracking
- 어플리케이션에서 발생하는 모든 이벤트를 카프카 토픽에 저장. (예: user click, registration, time spent on certain pages by users, orders 등) 해당 액션들을 분석하고 Tracking하는데 사용 (여행 예약 플랫폼에 들어가보면 몇명이 같은 상품 보고있다 라고 알려주는 것 등)
- 분석하거나, 레포트를 쓰거나 뉴스 피드를 알려주는 등 각 컨슈머에서 토픽으로부터 정보를 받아 각각 데이터를 처리
- Logging and monitoring system
- 카프카 토픽에 로그를 보내고, 카프카 클러스터에 로그를 보관한다
- aggregation이 가능함
- stream processing이 가능함 → log를 전처리해서 log-stroage solution에 저장되는 매게체로도 활용 가능
자 이제 카프카가 실제로 어떻게 활용되는지, 그리고 프로듀서, 카프카, 그리고 컨슈머가 어떻게 연동되어 동작할 수 있는지 알아보았다.
이제는 카프카를 한번 직접 실행시켜볼 차례다. 다음 글에서는 카프카를 직접 도커를 활용해 실행시켜보고, 프로듀서와 컨슈머를 연동해볼 것이다.
참고자료
https://www.ibm.com/docs/ko/ibm-mq/8.0?topic=ssfksj-8-0-0-com-ibm-mq-con-doc-q015280--htm
https://engineering.linecorp.com/ko/blog/how-to-use-kafka-in-line-1/
https://www.indellient.com/blog/example-of-using-apache-kafka/