프로젝트
-
kafka Consumer 그룹 리밸런싱프로젝트/kafka 2023. 8. 8. 00:01
Kafka Consumer 그룹 리밸런싱이란? Kafka Consumer는 토픽의 각 파티션에 대해 메시지를 처리합니다. 하지만 특정 Consumer에 문제가 생겨 더 이상 메시지를 처리할 수 없다면, 파티션의 소유권은 다른 컨슈머에게 이관합니다. 이러한 작업을 리밸런싱이라 합니다. Kafka Consumer 그룹 리밸런싱은 언제 일어날까? 1. 일반적으로 애플리케이션을 배포하는 상황에서 컨슈머가 생성/삭제되는 과정이 일어나기 때문에 발생합니다. 2. 시간 내에 Poll 요청 실패 3. 컨슈머가 일정시간 내에 하트비트를 보내지 못하는 경우 리밸런싱이 발생하면 어떻게 될까? 컨슈머 그룹 전체 메시지 처리 중단(Stop The World) 메시지 중복 컨슈밍 메시지 손실 실제로 예전에 문자메시지를 발송하는 ..
-
kafka Dead Letter Queue(DLQ, DLT)프로젝트/kafka 2023. 8. 7. 00:01
개요 AWS SQS에서는 Dead Letter Queue(DLQ)를 손쉽게 제공하고 연결할 수 있도록 합니다. 메시지가 실패하는 경우 재처리를 몇 번 할지도 console에서 간편하게 설정할 수 있습니다. Kafka의 경우 메시지 처리에 실패하면 Dead Letter Queue(DLQ)를 어떻게 관리할 수 있을까요? Kafka에서는 DLQ대신 DLT라는 개념을 사용합니다. DLT는 Dead Letter Topic의 약자입니다. SQS DLQ에 대해서는 다음글을 참고해 주세요. https://junuuu.tistory.com/740 [AWS] SQS DLQ 설정하기 DLQ란 무엇인가? DLQ(Dead Letter Queue)는 소프트웨어 시스템에서 오류로 인해 처리할 수 없는 메시지를 임시로 저장하는 특수..
-
kafka 메시지 삭제 정책프로젝트/kafka 2023. 8. 6. 00:01
개요 kafak를 운영하면 메시지를 언제까지 보관해야 할까요? kafka의 cleanup policy, retention policy, delete policy, compact policy 등에 대해 알아보고자 합니다. Kafka의 데이터는 어떻게 저장될까? kafka는 파티션에 데이터를 저장합니다. 카프카를 설정하면 파티션이 저장될 디렉토리의 위치를 log.dirs 매개변수에 지정할 수 있습니다. Kafka는 다른 메시징 시스템과 달리 토픽의 메시지가 소비된 후 즉시 삭제하지 않습니다. 대신 각 토픽의 구성에 따라 허용되는 공간과 관리 방식이 결정됩니다. Kafka의 구조는 Cluster -> Broker -> Topic -> Partition -> Segment Segment의 구조 특정 오프셋이나..
-
Kafka 객체 SERIALIZER, DESERIALIZER프로젝트/kafka 2023. 8. 5. 00:01
개요 Kafka를 사용하다 보면 메시지를 Stirng이 아닌 객체(DTO)로 전송하고 싶을 수 있습니다. 이때 Producer, Consumer Config를 알아보겠습니다. 테스트하기 위한 환경 local에서 실행할 수 있는 SpringBootApplication consumer 1대, producer 1대 docker, AWS MSK등으로 구성한 kafka 인프라 TestDTO data class TestDto( val col1: String, val col2: String, ) @Configuration @EnableKafka class KafkaProducerConfig { @Value("\${spring.kafka.producer.bootstrap-servers}") private lateini..
-
kafka Consumer group id 랜덤으로 부여프로젝트/kafka 2023. 8. 4. 00:01
개요 Consumer의 groupId를 랜덤으로 부여하여 pub/sub처럼 구성하고 싶었습니다. Instance가 여러 대일 때 동기화 하고자 했습니다. KafkaListener doc /** * Override the {@code group.id} property for the consumer factory with this value * for this listener only. * SpEL {@code #{...}} and property place holders {@code ${...}} are supported. * @return the group id. * @since 1.3 */ String groupId() default ""; groupId를 SpEL 문법을 통해서도 지정할 수 있습니다...
-
kafka consumer offset option (latest vs earliest)프로젝트/kafka 2023. 8. 3. 00:01
개요 만약 Consumer에서 동일한 토픽을 보고 다른 GroupId를 가진다면 새로운 Consumer가 생기는 경우 처음부터 메시지를 가져올 것이라 생각했고, 현재시점부터 메시지를 가져오기 원했습니다. Consumer의 auto-offset-reset 옵션 latest : 현재 시점부터 발생한 메시지부터 구독한다. (commit 관계없이 가장 최신) earliest : commit이 마지막으로 된 메세지부터 구독한다. (commit 기준으로 가장 오래된) none : 구독하고자 하는 topic의 offset 정보가 없으면 exception을 발생한다. 이미지로 살펴보기 consumer의 offset정보가 존재하지 않을 때 토픽의 가장 마지막 offset부터 읽습니다. earliest 옵션에 대해 오해한..
-
kafka는 왜 속도가 빠를까?프로젝트/kafka 2023. 7. 29. 00:01
개요 메시지큐에는 Kafka, RabbitMQ, ActiveMQ 등 다양한 선택지들이 있습니다. 보통 Kafka를 처리량이 많은 분산 메시징 시스템에서 사용하며 확장성, 고성능 및 높은 처리량이 항상 키워드로 따라옵니다. Kafka vs ActiveMQ, RabbitMQ 성능차이 Kafka의 특징 중 하나로 메시지를 메모리에 저장하는 Rabbit MQ, Active MQ와 다르게 파일에 저장합니다. 파일에 저장한다는것은 Disk에 저장하고 읽는다는 것인데 어떻게 빠르게 동작할 수 있을까요? 물론 처리량이 낮은 30MB/s이하에서는 RabbitMQ 가 조금 더 낮은 레이턴시를 보여줍니다. 하지만 30MB/s 이상 처리해야한다면? 카프카를 사용해야 할 것 같습니다. 카프카가 빠른 이유에 대해서 알아보도록 하..
-
Spring Boot WebSocket with Kafka프로젝트/WebSocket 2023. 7. 28. 00:01
개요 지난번 포스팅에서는 Spring WebSocket External Broker 적용을 통해 In-memory Broker인 SimpleBroker를 사용하지 않고 External Broker인 STOMP Message Broker인 ActiveMQ를 적용해 보았습니다. 하지만 저를 포함한 팀원들이 ActiveMQ에 대해 자세히 알지 못했으며 추후 트러블슈팅이나 운영 등을 생각해서 팀원들이 알고 있는 메시지 브로커인 Kafka로 WebSocket을 활용해보고자 합니다. 다시 보는 External Broker를 활용한 STOMP 구조도 하지만 Kafka는 STOMP 프로토콜을 지원하지 않습니다.. Kafka 어떻게 적용하지? - 다시 SimpleBroker로 다시 SimpleBroker로 돌아갑니다. ..