본문 바로가기

Dev Log29

Pub-Sub 구조에서 자주 발생하는 실수 Kafka를 통해서 Event Driven Architecture를 만들다 보면 흔히 발생하는 실수가 한 가지 있다. 바로 트랜잭션 종료 전에 Event를 전송하게 되는 것이다. 가령 상품을 생성하고 상품 번호를 받아서 후처리를 하는 경우, Subscriber에서 상품 번호로 조회를 하고자 하면 조회가 되지 않을 수도 있다. Publisher와 Subscriber 각각 layer 단위로 테스트 할 때는 발견이 되지 않는 문제다. 또한 개발 서버에서 테스트할 때도 Kafka와 DB의 속도 차이에 따라 테스트 중에 발견이 되지 않을 수도 있다. 다른 팀과 함께 협업을 하는 상황이라면 어디에서 잘못된 것인지 알아채기 굉장히 어려운 경우도 종종 있었던 것 같다. Subscriber 기준에서 Retry 설정을 갖.. 2022. 2. 16.
Kafka 자주 쓰는 명령어 정리 버전 확인 $ bin/kafka-topics.sh --version Topic 관리 토픽 생성 $ bin/kafka-topics.sh --create --zookeeper ${zookeeper} --replication-factor 3 --partitions ${partitions} --topic ${topicName} * 토픽을 생성할 때 deadLetter도 함께 만들어 두는 습관을 갖자. deadLetter는 토픽의 파티션과 같은 숫자여야 한다. 토픽 확인 $ bin/kafka-topics.sh --describe --zookeeper ${zookeeper} --topic ${topicName} 토픽의 파티션 갯수, replication factor, retention등의 부가 설정을 확인할 수 있.. 2022. 2. 16.
/dev/null 이해하기 Backend 개발자로서 업무 중에 스크립트를 작성할 일이 많지 않지만, 배포 스크립트를 작성하다 보면 리눅스 잘 모르는 사람으로서 당황스러운 구문이 /dev/null이었다. java -jar myapplication.jar > /dev/null 2> /dev/null jar로 되어있는 프로그램을 실행시킨다. > /dev/null => 실행 결과에 대한 응답값(STDOUT)을 무시한다. 2> /dev/null => 실행시 오류(STDERR)를 무시한다. 실행한 곳에 EOF를 전달한다. & => 백그라운드로 실행한다. /dev/null 자체는 리눅스에서.. 2021. 10. 14.
Modern Java In Action 정리 - 13 디폴트 메서드 자바8 이전에는 인터페이스에 새로운 메소드를 추가하게 된다면 해당 인터페이스를 implement하는 쪽에서 전부 compile error가 나곤 했다. 따라서 하나의 인터페이스를 정의하더라도 굉장히 고심해서 설계해야 했다. 하지만 요구사항은 쉽게 변하고 변경이 많아지기 때문에 이러한 문제는 어떻게든 계속 일어나게 된다. 자바8에서는 인터페이스에 static method 와 default method를 추가해서 이 문제를 해결하고자 했다. 인터페이스를 구현하는 클래스는 자동으로 추가된 디폴트 메서드를 상속받게 된다. default void sort(Comparator 2020. 7. 11.