소개
#Kafka #Streaming #DataEngineer
- 카카오 데이터 엔지니어(전: SK플래닛)
- 저서
- 아파치 카프카 애플리케이션 프로그래밍 with 자바
- 예스24: https://bit.ly/3uFmhpF
- 교보문고: https://bit.ly/39Pk0Ak
- 알라딘: https://bit.ly/3a3Xa7T
- 실시간 데이터 파이프라인 아키텍처
- 예스24: https://bit.ly/3JjY96j
- 교보문고: http://bit.ly/3WEcgGJ
- 알라딘: https://bit.ly/3Hcbwmz
- 아파치 카프카 애플리케이션 프로그래밍 with 자바
강의
로드맵
전체 1수강평
- [아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
- [아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
게시글
질문&답변
카프카 2.8.2 버전과 많이 차이가 있을까요??.
안녕하세요.강의를 들을때 사용하는 현재 2.5.0 버전도 현재 현역으로 많이 활용되고 있습니다. 2.8.2로 올라가면서 많은 부분 발전되었고 패치가 되었으나 버전 호환이 잘 되는 마이너 버전 업그레이드이기 때문에 너무 걱정하지 않으셔도 됩니다. 말씀하신 바와 같이 2.5.0을 듣고 release note를 공부하시면서 2.8.x버전의 차이점을 공부하는 방식은 카프카의 생태계와 발전 방향을 이해하는데 매우 좋은 방법이라 말씀드릴 수 있습니다.
- 0
- 2
- 14
질문&답변
카프카 컨슈머와 커넥트에 대해 질문 드립니다.
안녕하세요~카프카 싱크 커넥터는 컨슈머의 구현체이므로 결과적으로 비슷한 동작을 하는 것은 맞습니다. 하지만, 분명 다른점이 있습니다. 아래는 그 예시입니다.카프카 싱크 커넥터는 commit을 직접 수행할 수 없음컨슈머는 commit을 직접 수행할 수 있고 다양한 commit 옵션이 있음컨슈머는 리밸런스 리스너를 등록할 수 있음카프카 커넥트는 stateless 처리만 가능카프카 커넥트는 분산 프로세스로 운영되고 내부 스레드로 여러개의 싱크 커넥터를 실행할 수 있음많은 DB업체에서는 카프카와 DB연동을 위한 커스텀 커넥터를 오픈소스로 제공하고 있음위와 같은 사유로 인해, 카프카와 DATABASE와 연동시 카프카 커넥트를 사용하는 것이 좋고 일반적으로 많이 사용되는 방식이라고 말씀드릴 수 있습니다. 일반적으로 우리가 데이터베이스와 연동하는 사용 형태를 보면 테이블이 1개만 끝나는게 아니라 10개 100개 이상으로 늘어날 수 있고 해당 동작은 유사할 수 있습니다. 이런 경우 매번 컨슈머 애플리케이션을 배포하는 것이 아니라 카프카 커넥트를 사용하여 파이프라인을 반복적으로 만들면 더욱 유지보수가 편리하게 될 수 있습니다.반면, 컨슈머를 개발해야할 때도 있겠습니다. 컨슈머는 내부적으로 다양한 커밋 타이밍을 처리할 수 있고 리밸런스 리스너를 통해 stateful처리를 할 때 유용하게 활용할 수 있습니다. 이러한 동작은 커넥트에서는 구현할 수 없습니다. 그러므로 이런 특징이 필요할때는 불가피하게 컨슈머를 개발해야할 것 입니다.결과적으로, 단발적인 배포+stateful처리+ 커밋타이밍 조절 등의 특징이 있을 경우에는 컨슈머를 개발하시고 / 반복적인 배포+stateless처리+database와 연동 등의 특징이 있을 때는 커넥트를 구성하여 운용하시는 것이 좋겠습니다.카프카 커넥트를 활용한 개발 사례에 대해서 아래 링크를 확인해보시면 더욱 이해하시기 좋을것 같습니다.https://tech.kakao.com/posts/506
- 0
- 2
- 26
질문&답변
Kafka 서버에서 Kafka만 실행하는 게 일반적인가요?
안녕하세요. 모든 서버가 그러하듯이 하나의 서버에는 여러 애플리케이션을 띄워서 사용하는 경우도 종종 있습니다. 그런데 문제는 이렇게 하나의 장비에 여러 애플리케이션이 실행되면 해당 애플리케이션의 부하와 미래 리소스를 예측하기 어려워지는 부분이 있습니다. 예를 들어 네트워크 사용량같은 것을 분리하여 보기 어렵기 때문에 리소스 확인 및 분석이 어려울 것입니다. 물론, 아주 작은 애플리케이션(로그 수집 등)이 함께 돌아가는데는 문제 없을 것입니다.그러므로, 일반적인 상용환경에서는 장비의 일관성 그리고 리소스의 확인, 유지보수의 편의성을 위해 각각 별도의 서버 장비로 발주하여 실행하는 것이 좋은 방법이라 말씀드릴 수 있ㅅ브니다.
- 0
- 2
- 16
질문&답변
카프카 스트림즈와 커넥트 활용 사례가 더 궁금합니다.
안녕하세요! 답변드립니다.카프카 스트림즈의 경우 스트림즈DSL을 통해 Window, aggregate와 같은 Stateful처리를 지원하고 있습니다. stateful 처리의 특징은 이전 레코드를 참고한다는 점인데요. 이런 특징으로 인해 카프카 스트림즈는 stateful처리에 강점을 가지고 있습니다. 물론, stateless처리도 지원합니다!반면, 카프카 커넥트의 경우 각각의 레코드에 대해 단일 처리를 할 수 있으며 별도의 statful처리를 위한 메서드를 제공하고 있지 않습니다. 그렇기 때문에 일반적으로 Stateless처리를 수행하면서도 반복적인 파이프라인을 생성할 때 효과적입니다. 그리고 커넥트의 경우 커스텀 커넥터(오픈소스)를 통해서 다양한 카프카DATABASE 파이프라인을 사용할 수 있기 때문에 일반적으로 이기종 데이터베이스와 연동하는데 활용하는 것이 일반적이라 볼 수 있습니다.결과적으로 카프카 스트림즈는 반복된 애플리케이션이 아닌 단일 애플리케이션으로써 window, aggregate와 같은 stateful처리에 적합합니다. 반면, 카프카 커넥트는 반복적인 파이프라인을 운영할 때 필요하다고 볼 수 있습니다.
- 0
- 2
- 30
질문&답변
kafka retention 관련하여 질문드립니다.
안녕하세요!문의주신 내용 답변드립니다.세그먼트의 마지막 레코드가 전송된 이후, 말씀하신 바와 같이 저장되지 마자 삭제되는 상황이 발생할 가능성은 적습니다. 왜냐면, 액티브 세그먼트가 아닌 세그먼트로 변경된 시점을 기준으로 retention.ms가 지나면 삭제되기 때문입니다. retention.ms가 극도로 작다면 말씀하신바와 같이 적재와 함께 삭제될 수 있지만, 일반적으로 24hour 이상으로 설정되는 이상 적재와 함께 삭제되지는 않습니다. 그리고 말씀하신바와 같이 장애가 발생했을 때 메시지를 확인하고 싶은 니즈가 있다면 retention.ms를 충분히 길게 설정하시는 것을 추천드립니다.추가로 레코드 단위로 retention은 일반적인 스트림 상황에서 적용할 수 없습니다. kafka-streams에서 materialized view로 활용할 경우에만 key에 null을 넣는 경우도 있지만, 특수하게 사용하는 부분입니다.
- 0
- 2
- 64
질문&답변
브로커의 장애복구 이후 처리과정에 대해서 질문드립니다.
안녕하세요. unclean.leader.election.enable=true 일때 ISR이 아닌상태에서 브로커 장애가 발생한 경우 프로듀서의 acks 옵션에 따라 두가지 방식으로 진행됩니다.1) producer acks=all 인 경우특정 브로커에 레코드를 전송을 완료하고 복제되기를 기다리다가 장애가 발생하는 경우일 것입니다. 브로커 입장에서는 해당 레코드가 복제되지 않았다는 것을 알고 있으며 프로듀서는 응답을 받지 못해 timeout이 발생하게 됩니다. 이에 따라 retry를 진행해서 레코드를 승급된 리더 파티션(이전엔 팔로워 였음)으로 전송하므로 레코드는 안전하게 재전송됩니다. 2) producer acks=1인 경우 특정 브로커에 레코드를 전송을 완료하고 장애가 발생하게 되는 경우일 것입니다. 브로커 입장에서 해당 레코드가 복제되지 않았고, 프로듀서 입장에서는 정상 전송되었다고 판단하므로 해당 레코드는 유실 시키고 다음 레코드를 프로듀서가 전송하게 됩니다.
- 0
- 2
- 111
질문&답변
카프카의 도입 시기를 결정하는 노하우가 더 있을까요?
안녕하세요!현재 카프카 도입을 고려하고 있으나, 적당한 상황인지 고민이신것으로 이해됩니다. 말씀하신 사항을 고려하여 문의주신 내용 답변드립니다.1) 웬만한 대기업, 대형 서비스가 아니고서야 Kafka 도입은 오버스펙일까요?아닙니다. 카프카는 분산 이벤트 스트리밍 플랫폼으로써 타 플랫폼으로는 대체 불가능한 기준으로 자리잡고 있습니다. 그만큼 카프카의 특성은 이벤트 데이터를 실시간 처리하는데 매우 특화되어 있습니다. 그렇기 때문에, 실시간 데이터를 다루고 로직상 스트림 프로세싱이 필요하다면 카프카 도입은 시간 문제라고 볼 수 있겠습니다. 또한, 카프카는 작은 규모의 클러스터를 구축하여 소규모 데이터부터 시작할 수 있으며, 브로커 스케일 아웃을 통해 추후 커질 수 있는 대규모 데이터도 커버 가능하므로 대형, 대기업이 아니더라도 사용할 수 있고, 이미 많이 사용되고 있습니다. 2) 저희 회사처럼 단일 서비스에 대한 데이터 처리와 고가용성을 확보하려고 하더라도 Kafka 도입이 의미가 있을까요? 강의에서 언급된 인스턴스 스펙보다 낮은 수준의 인스턴스에서 Kafka 를 실행하는 건 괜찮을까요?단일 서비스에 대해서 스트림 데이터를 처리하면서 안전하게 데이터를 처리하기 위해서는 카프카 도입이 적당할 것으로 보입니다. 말씀하신 사항을 보면 100MB/s, 1,000,000TPS 수준의 데이터는 결코 작지 않으며 프로세싱을 위해서는 분산 처리가 필수적인데, 이러한 상황을 고려하면 카프카의 도입은 충분히 의미가 있을 거라 생각됩니다. 그리고 인스턴스 스펙은 항상 사용하는 환경에 따라 다를 수 있기 때문에 제안하는 수준의 스펙보다 크거나/작음 보다는 다루고자 하는 데이터의 크기와 양을 내부적으로 충분히 테스트하시고 결정하면 될것 같습니다. 3) Kafka 는 어느 정도의 트래픽이 발생해야 도입이 유의미할까요?절대적인 데이터 양으로 카프카의 도입 여부를 결정하기는 어려울 것 같습니다만, 굳이 정해보자면 100TPS 이상이며 스트림 프로세싱(window, mapping, aggregation 등)이 필요하다면 카프카 도입을 고려할 것 같습니다. 4) Kafka 도입을 고려하는 시점에 대한 의사결정 요소에 어떤 것들이 있을까요? 키워드 위주로만이라도 설명해주시면 제가 한 번 조사해보도록 하겠습니다.앞서 몇번 더 설명한 것과 같이, '분산', '고가용성', '스트림 프로세싱' 이 가장 중요한 키워드 일것 같습니다. 이러한 스트림 프로세싱 플랫폼 없이는 적절한 로직 개발이 매우 어렵기 때문입니다. 배치처리 또는 마이크로 배치처리로 요구사항을 만족시킨다면 문제 없겠습니다만, 스트림 처리에 특화된 기능들(window, aggregation 등) 그리고 대규모 데이터를 안정적이고 낮은 지연(latency)로 처리하기 위해 distributed processing을 만족시키기 위해서는 카프카가 많은 부분 도와줄 것이라 생각됩니다. 감사합니다. 추가적으로 궁금한 사항 있으면 편하게 문의주세요~
- 0
- 2
- 151
질문&답변
min.insync.repllicas, acks옵션, 그리고 리더 파티션 승급
안녕하세요!리더 파티션 1개, 팔로워 파티션 2개가 존재할 때, 팔로워를 승급시키는 기준은 여러가지가 있습니다. ISR에 포함된 팔로워 파티션(브로커)인지, replica가 잘 되고 있는지가 가장 중요할 것 같습니다. 관련 코드는 다음과 같습니다.object PartitionLeaderElectionAlgorithms { def offlinePartitionLeaderElection(assignment: Seq[Int], isr: Seq[Int], liveReplicas: Set[Int], uncleanLeaderElectionEnabled: Boolean, controllerContext: ControllerContext): Option[Int] = { assignment.find(id => liveReplicas.contains(id) && isr.contains(id)).orElse { if (uncleanLeaderElectionEnabled) { val leaderOpt = assignment.find(liveReplicas.contains) if (leaderOpt.isDefined) controllerContext.stats.uncleanLeaderElectionRate.mark() leaderOpt } else { None } } } ... 생략상기 코드는 실제 카프카 코드로 오프라인이 발생했을 때 리더를 선정하는 코드로 질문에 대한 답이 될 것 같네요!https://github.com/apache/kafka/blob/3.8.0/core/src/main/scala/kafka/controller/PartitionStateMachine.scala
- 0
- 1
- 50
질문&답변
커밋 관련 질의
안녕하세요. 카프카에서 제공하는 기본 Kafka-clients 라이브러리를 사용하고 계신다면 말씀하신 상황들에서 커밋을 수행할 수 있습니다. 리스너라고 말씀하신걸 보니 스프링 카프카를 언급하신것 같은데, 만약 스프링 카프카에서 커밋을 수행하고 싶으시다면 shutdown hook에서 실행되고 있는 컨슈머 클라이언트 객체를 가져와서 커밋을 수행하셔야 합니다. 관련해서 acknowledgment 인터페이스를 참고하시면 좋을것 같습니다.https://docs.spring.io/spring-kafka/docs/current/api/org/springframework/kafka/support/Acknowledgment.html
- 0
- 2
- 91
질문&답변
카프카 보안
안녕하세요! AWS에서 카프카가 구축되어 있는 상태에서 연동하는 방법에 대해 문의 주셨는데요. 이것은 운영중인 환경보안 설정을 어느정도로 하느냐에 따라 다를 것 같습니다. 말씀하신 바와 같이 whitelist처럼 각 ip만 허용하는 방식은 가장 안전한 방법이지만 유연하지 못해서 운영상 어려움이 있을 것 같네요. 만약 AWS에서 운영한다면 카프카 클러스터와 컨슈머를 VPC로 함께 묶어서 운영함으로서, ip는 외부에 노출시키지 않고, 내부적으로는 통신이 원활하게 하는 방식을 채택할 것 같습니다.
- 0
- 2
- 136