Oct 7, 2023 - kafka 에 적용했던 옵션 정보들

2020-11-25-kafka.md

3년만에 다시 작성하는 kafka 추가 내용.

kafka version 1.1.1

프로듀서의 옵션

  • enable.idempotence 옵션을 true로 설정:
    멱등성 : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질 [원자성 보장]
    enable.idempotence를 true로 설정하면, 카프카 프로듀서(Producer)가 메시지를 전송할 때 이중 전송 및 재전송을 방지합니다.
    즉, 메시지가 중복으로 전송되지 않도록 보장합니다. 이는 메시지 전달의 신뢰성을 높이는 데 도움이 됩니다.

3개의 브로커에 최소 복제2를 만족하면 전송 성공


import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

// Properties 객체를 생성하고 설정 값 할당
Properties props = new Properties();
props.put("bootstrap.servers", "host etc .... ");
props.put("retries", 1);     // 재시도 횟수
props.put("batch.size", 65536); // 크기기반 일괄처리
props.put("linger.ms", 100);   // 시간기반 일괄처리
props.put("buffer.memory", 33554432); // 전송대기 버퍼
props.put("max.request.size", 1048576); // 요청 최대크기
props.put("min.insync.replicas", 2); // 최소 복제
props.put("enable.idempotence", true); // 데이터 중복 개선.
props.put("max.in.flight.requests.per.connection", 1); // 수신 미확인 요청의 최대 수
props.put("request.timeout.ms", 5000); // 전송후 request 타임아웃 시간 RETRY
props.put("max.block.ms", 100); // 전송후 응답시간
props.put("compression.type", "gzip");
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

// Kafka 프로듀서를 생성
Producer<String, String> producer = new KafkaProducer<>(props);

// 메시지를 보내려면 ProducerRecord를 생성하고 send 메서드로 전송
ProducerRecord<String, String> record = new ProducerRecord<>("topic-name", "key", "value");
producer.send(record);

// 프로듀서를 닫아 리소스를 정리
producer.close();

  • acks 옵션을 all로 설정:
    acks 옵션을 all로 설정하면 프로듀서가 메시지를 전송한 후 해당 메시지가 모든 인스턴스에 성공적으로 복제될 때까지 대기합니다.
    이는 메시지의 안정성을 높이는데 도움이 되며, 메시지가 분실되지 않도록 보장합니다.
    그러나 전송 지연이 발생할 수 있습니다.

  • replication.factor 옵션을 3으로 설정:
    replication.factor를 3으로 설정하면 카프카 토픽의 파티션(Partition)이 세 개의 복제본을 가지게 됩니다.
    이는 데이터의 내고장성을 보장하고, 하나 이상의 브로커(Broker)가 실패해도 데이터 손실을 방지합니다.
    따라서 데이터의 안정성을 높이는데 도움이 됩니다.

  • min.insync.replicas 옵션을 2로 설정:
    min.insync.replicas를 2로 설정하면 메시지를 전송할 때 적어도 두 개의 복제본이 동기화되어야 한다는 조건을 만족해야 합니다.
    이것은 데이터의 내고장성을 보장하기 위해 사용됩니다.
    즉, 적어도 두 개의 복제본이 성공적으로 메시지를 수신한 경우에만 프로듀서가 성공으로 간주됩니다.
    이렇게 설정 옵션을 변경함으로써, 카프카에서 데이터의 신뢰성과 내고장성을 높일 수 있습니다.
    그러나 이러한 설정 변경은 성능 및 지연에 영향을 미칠 수 있으므로 신중하게 고려해야 합니다.

전송 실패시 아래 이미지의 retry에 파일이 생기고 retryok로 이동

  • retryok 에 있는 재처리완료 파일은 3일후 자동 삭제.
    [DevOps + AI] 카프카, 대규모 클러스터 운영 후기 / if(kakao)dev2022 https://www.youtube.com/watch?v=SuHtHQkRV7g 를 보면, retry 가 아닌, For Fault 라는 별도의 카프카를 또 하나 두어 장애처리는 하는 것을 보고 더 괜찮은 생각이라 생각이 들었으나, 파일로 저장 후 후처리도 그때 당시에는 괜찮은 전략이었습니다.

장애시 처리 / 복구 절차 - 카프카

  1. kafka ISR 그룹에 브로커들이 정상적으로 존재하는지 상태 확인
    $ bin/kafka-topics.sh -describe –zookeeper localhost:2181
    http://:/clusters/kafka/topics/xxxData

  2. kafka 서버 ISR 상태에 따라 순차적인 재시작, 최소 서버 2대이상 살아있어야 안정적인 운영가능.
    현재 카프카는 디스크 full로 다운된 현상 말고는 문제가 없음.

  3. 처리 현황파악
    3-1. 각 was의 에러로그 확인
    $ curl http://:/cronwork/monitoring/kafka_error_retrycnt.txt
    3-2. 텔레그램 연결하여, 알람으로온 전송지연서버의 producer MBeans (record-send-rate) 확인
    3-4. 재처리 진행 여부 확인 : 각 서버의 error log 의 재처리 진행 상황 확인
    $ grep KafkaError /home/xxx/logs/log4j/xxx.infolog.log
    3-5. 각 was 의 컨슈머서버의 인스턴스 확인 http://:/clusters/kafka/consumers/group-billing/topic/xxxx/type/KF Consumer Offset 의 마지막 Offset 값을 확인 3-6. 컨슈머의 파티션별 offset 을 마지막 offset으로 위치 이동하고 $ bin/kafka-consumer-groups.sh –bootstrap-server : –group group2 –reset-offsets –to-latest –all-topics –execute 3-7. row단위 데이터 에서 1번에서 확인된 번호의 시간대부터 재시작한 시간의 범위를 재처리 컨슈머로 구동.


카프카는 이벤트 드리븐 아키텍쳐와 스트림 데이터 파이프라인에서 중요한 역활을 수행하며, 스트림 이벤트를 다루는 데 특화되어 있는 카프카는 실시간 데이터를 처리하는데 적합합니다.
시간 단위 이벤트 데이터를 다루기 위한 타임스탬프 순서를 보장하기 위한 파티션과 메시지 키와 같은 기능이 카프카에 포함되어이 있습니다.

메시지 전달 신뢰성

정확히 한번 (Exactly-once) : 모든 데이터 처리가 단 한번만 처리. 이벤트 데이터가 발생되었을때 단 한번만 처리됨.

적어도 한번 (At least once) : 네트워크, 브로커 장애 등에 의해서 데이터를 중복 발행, 수행, 적재 됨을 의미. 어느 누구도 은행에서 이체되었을떄 한번만 되길 원하지 2번 이상 되길 원하지 않음.

최대 한번 (At most once) : 관련 장애에 의해 유실되지 않는 것을 원함.

Sep 15, 2023 - 개발팀의 진행 프로세스

개발팀 진행 업무 프로세스

Sprint Life Cycle

SLC

SLC

Requirement Life Cycle

RLC

RLC

상태 설명 상태 전이 가능자 정보 추가
요청됨 개발 요청서 작성 누구나 오류내용, 기대결과
보류 개발안함, 다른방식으로 기능 제공 됨 PMO, 개발자 사유
요구사항분석 백로그, 구체적 내용 확인 (필요 시 인터뷰) PMO, 개발자 담당자 지정
개발 중 담당자가 업무를 시작함 담당 개발자 작업일정
개발완료 요구사항 개발 완료 담당 개발자 (검증 환경 및 조건)
검증 중 QA담당자가 확인하는 중 QA 담당자  
수정 중 개발된 결과에 오류가 발견됨 QA 담당자 재현 조건
검증완료 기능동작 확인. 배포대기 QA 담당자 배포 버전/일, 릴리즈 노트
배포됨 수정내용이 포함된 바이너리가 배포됨 PMO, 개발자 배포버전, 배포일

PMO 는 요구사항 관계자로 대체 가능합니다.
이러한 프로세스 표는 프로젝트 관리와 협업을 효과적으로 조직하고 추적하는 데 도움이 되며, 무조건적인 진리는 아닌, 프로젝트의 크기, 복잡성 및 요구 사항에 따라 조정이 가능한 영역입니다.

다만, 이표를 근거로, 프로젝트의 상태 및 진행을 시각적으로 추적하고, 팀 간의 의사 소통을 강화하기 위해 도입되었습니다.

Semantic Versioning

참고: https://semver.org/lang/ko/

Semantic Versioning (SemVer)를 커스터마이즈하여 프로젝트에 맞게 조정하는 것은 흔한 일입니다.

  1. 기존 버전과 호환되지 않는 대규모 업데이트는 “MAJOR” (주) 버전을 올린다.
  2. 기존 버전과 호환되면서 새로운 기능을 추가할 때는 “MINOR” (부) 버전을 올린다.
  3. 기존 버전과 호환되면서 버그를 수정한 것이라면 “PATCH” (수) 버전을 올린다.
  4. QA 를 할 수 없거나, 필요가 없는 업데이트 (ex : sre 작업, info, error 등 백엔드 단순작업, query 수행 등)라면 “NOQA” (무시주석) 버전을 올린다.

현재 배포 예정중인(비정기 배포) 사항에 긴급하게 Hotfix 처리를 통해서 배포 되어야할 경우
부득이 하게 miner(N.N.N) 버젼명을 변경하여 예정중인 버젼명을 일괄 변경 처리해야되는 부분을 고도화 하여
miner 버젼 숫자를 두자리(NN)으로 적용해서 차기 버젼명을 바꾸지 않고 처리하는것으로 정리.

Sep 8, 2023 - 인공지능 소프트웨어 품질보증을 위한 테스트 기념

simple3

AI 는 엄청난 발전을 하고 있고, 뛰어난 많은 개발자들에 의해 정형화, 일반화된 모델 및 라이브러리가 존재합니다.

그러나 AI 를 정확하고 명확하게 사용하기 위해서는 질문과 정답에 대한 많은 샘플 데이터가 필요합니다. 그렇게 했을 때 샘플만의 데이터를 가지고 테스트를 어떻게 성공할 수 있는지에 대한 설명을 합니다.

1장은 기본적인 AI 모델 기법에 대해서 나옵니다. 은닉층, 포레스트, 앙상블 등 기초적인 부분의 일반적인 내용이 그림과 같이 잘 설명되어있습니다! 회사에 QA 팀이 있어, 테스트 방법론에 관심이 있어 AI 의 자동 테스트 기법이라 판단해서 서평을 신청한 건데, 책 자체가 자신이 만든 AI 개발건에 대한 테스트 방법론에 대한 이야기였습니다.

테스트 기법의 이름은 메타모픽, 뉴런 커버리지, 최대 안전 반경, 커버리지 이렇게 4개의 기법에 대해 설명을 하고 있습니다. 개발자는 TDD 라는 개념이 있어, 테스트 주도 개발에 대해서 접근을 하려고 하는데, AI 의 경우는 학습이 완료된 모델에 대한 테스트 코드를 작성하는 방법에 대해 이야기 하고 있어 매우 재미있게 보았습니다. 실제로 저도 테스트 코드를 개발을 하면서 진행하기보다, 배포 전에 유니 테스트가 가능한 개발건이었는지를 검토하는 단계에서 테스트 코드를 작성하고 있습니다.

그래서 메타모픽의 경우, 학습된 모델에 대해서 각도를 회전시키면서 변경하여 처리하는 것을 이야기합니다. 해당 부분까지가 4장까지 이야기인데, 대부분의 테스트 코드는 DNN 을 기준으로 작업이 되어있습니다.

– 책을 다 읽고나서 9월 15일 추가내용입니다.– AI 개발은 데이터가 매우 중요하다는 생각을 합니다.

AI 모델을 효과적으로 테스트하기 위해서는 풍부한 샘플 데이터가 필요하고, 이 데이터는 모델을 학습시키는 데 사용된 데이터와 다를 수 있어야 합니다.
모델이 학습한 데이터에 대해서는 이미 잘 수행할 것으로 예상되기 때문에, 따라서 테스트 데이터는 다양한 시나리오와 엣지 케이스를 포함하고 있어야 한다는 생각은 자주했는데, 이 책은 그러한 부분에 자세한 설명이 있는 거 같습니다.

책에는 테스트 방법론에 대해서 나왔는데, AI 모델의 개발과 테스트는 반복적인 과정에 대해, 새로운 모델 버전을 개발하고 테스트할 때마다 모델의 버전 관리 내용이 있었으면 더 좋지 않았을까 아쉬운 점이 있습니다.
이를 통해 어떤 모델 버전이 어떤 수정 사항을 포함하고 있는지 추적할 수 있으며, 문제가 발생했을 때 특정 버전으로 롤백할 수 있습니다.

완성된 모델이 잘 만들었는지가 아닌, 테스트 주도 개발(TDD)에 대한 내용도 있었으면 좋지 않았을까 싶은데, AI 에 적용하긴 아직 먼 미래같습니다.
테스트 환경 구성 자체가 실업무가 아닌, 초심자 기준인 것도 조금 아쉬웠습니다.

마지막으로 자동화 테스트에 대한 부분이라든가 실업무에 도입되기에는 이론적인 부분이 많아보입니다!