전체 글
-
우리는 왜 spring kafka batch listener를 활용하지 않나요?프로젝트/kafka 2024. 12. 1. 23:38
개요신규입사자분께서 우리는 왜 kafka message를 consume 할 때 batch listener를 활용하지 않는지, 그 선택에서 어떤 히스토리와 결정이 있었는지 물으셨습니다. 단건씩 메시지를 받지 않고 batch listener를 활용하여 한번에 여러 건의 메시지를 받으면 네트워크 레이턴시를 아낄 수 있을 것 같다는 의견을 주셨습니다. 질문 주신 내용이 합리적인 생각이라는 들었지만 batch listener에 대한 지식이 없었기 때문에 why에 답변을 할 수 없었습니다. 그에 대한 답을 찾기 위한 여정을 기록해보고자 합니다. Batch Listener란?@Beanfun myContainerFactory(): ConcurrentKafkaListenerContainerFactory { val..
-
spin lock 대신 Thread Waiting을 활용하면 성능이 얼마나 개선될까?성능테스트 2024. 11. 23. 09:38
개요spin lock 방식에서 cpu의 리소스가 얼마나 점유될지 궁금하여 성능 테스트하면서 글을 작성했습니다. 만약 spin lock 방식 대신 Thread Sleep 방식을 적용하면 cpu의 성능이 얼마나 개선될 수 있을까요? Thread Sleep 방식을 알아보기 전에 임계영역을 점유하는 방법인 metux에 대해 알아보겠습니다. mutex란?Mutex는 특정 구현보다는 이론적인 용어로써 임계 영역에 여러 스레드가 경합하는 것을 방지합니다. Thread A는 임계 영역에 들어가기 전 lock을 점유합니다. 이후 Thread B가 Thread A가 접근한다면 임계 영역에 진입하지 못하고 기다려야 합니다. 이후 Thread A가 unlock을 수행하면 Thread B가 접근할 수 있습니다. 일상생활적으로 ..
-
MSA 환경에서 enum에 대한 위험성 줄여나가기Spring Framework 2024. 11. 16. 16:05
개요소프트웨어를 개발하다 보면 상수들의 집합을 관리하기 위해 enum을 활용하곤 합니다. ProductType을 enum으로 관리하게 된다면 여러 상품들을 enum으로 관리할 수 있습니다. 여러 서버에서 ProductType이라는 enum을 관리해야 한다면 어떤 일이 발생할 수 있을까요? 여러 서버에서의 불일치ProductType의 enum이 두 서버에서 관리된다면 혹은 백개의 서버에서 내부적으로 관리된다면 어떨까요? 새로운 Product가 추가되었을 때 관심사의 밖 혹은 추가하는것을 잊어서 여러 서버에서 차이가 발생하게 됩니다. 여러 서버에서의 불일치가 생기고, 신규 서버가 생성될때도 ProductType의 enum을 매번 추가해줘야 하는 불편함이 있을 것 같습니다. 공통 라이브러리로 관리하자만약 ..
-
Spring Bean 이름은 왜 소문자로 시작할까?Spring Framework 2024. 11. 3. 17:06
개요특정상황에서 Spring Bean의 이름으로 컨테이너에서 가져와서 활용하는 경우가 있었고 그 경우에 NoSuchBeanException이 발생하여 문제의 원인을 파악하고 알게 된 내용들을 정리해보고자 합니다. 스프링 컨테이너에 등록된 빈 이름은 어떻게 될까요?@Componentclass Z@Componentclass FooBar@Componentclass HTMLParser 대부분 일반적으로 앞자리가 소문자로 바뀌게 된다고 알고 있습니다.Z는 z로 FooBar는 fooBar로 HTMLParser는 hTMLParser로 바뀌게 될까요? @Componentclass BeanTest( private val applicationContext: ApplicationContext): ApplicationRunn..
-
분산시스템에서 로깅 트레이싱 전파는 어떻게 이루어질까?Spring Framework 2024. 10. 26. 20:30
대상 독자logback과 MDC를 활용하여 kafka, coroutine, async에도 트레이싱 전파를 어떻게 하는지 알고 싶으신 분들 개요 MSA 환경에서 Client가 하나의 호출을 수행했을 때 하나의 요청을 모아서 모니터링하고 싶으면 어떻게 해야 할까요? 아래 질문들에 대해 하나씩 답을 찾아가 보고자 합니다. 1. Server A에서 Spring MVC를 기반으로 여러 객체들이 협력하면서 비즈니스를 처리할텐데 어떻게 이어질 수 있을까? 2. Server A 에서 coroutine을 활용하면 어떻게 될까? 3. Server A 에서 @Async를 활용하면 어떻게 될까? 4. Server A가 kafka produce를 하고 Server B 가 consume을 수행하면 어떻게 될까? 5. Server..
-
하이버네이트 flush 순서에 주의하자JPA 2024. 10. 19. 20:20
대상독자하이버네이트 동작원리를 잘 모르고 사용했을 때 어떤 일이 발생할 수 있는지 궁금하신 분들 개요애플리케이션을 개발하던 중 하이버네이트의 동작원리를 잘 몰랐기 때문에 버그가 발생하게 되었습니다. 하이버네이트의 동작원리를 알아보면서 버그를 재현해보고 어떻게 해결할 수 있는지 정리해보고자 합니다. 하이버네이트란?하이버네이트(Hibernate)는 자바 애플리케이션과 관계형 데이터베이스 간의 상호작용을 간소화하기 위한 객체-관계 매핑(ORM) 도구입니다. 자바 클래스와 데이터베이스 테이블을 매핑하여, 자바 객체를 데이터베이스의 레코드로 변환하고 그 반대의 작업도 처리합니다. 이를 통해 개발자는 직접 SQL 코드를 작성할 필요 없이 데이터베이스와의 복잡한 상호작용을 처리할 수 있습니다. 하이버네이트를 ..
-
spring kafka auto-commit 동작원리 : 데이터 유실과 중복처리프로젝트/kafka 2024. 10. 13. 14:52
대상 독자spring kafka의 auto-commit 동작원리를 알고 싶으신 분들 auto-commit을 활용할 때 데이터 유실과 중복처리를 제어할 수 있는 방법을 알고 싶으신 분들 개요많은 블로그들을 살펴보면 kafka consumer의 옵션 중 하나인 auto-commit은 일정주기로 commit을 수행하기 때문에 메시지의 중복 및 유실이 발생할 수 있다고 설명합니다. 일정주기로 자동으로 commit을 수행한다는 것은 메시지가 처리되는 중간에도 commit이 일어날 수 있을 것 같습니다. 만약 auto-commit을 활성화한다면 내부적으로는 어떤 일이 일어날까요? 이번 글에서는 spring kafka에서 auto-commit이 어떻게 동작하는지 알아보고 이 과정에서 데이터 유실과 중복처리를 어떻게..
-
spin lock은 cpu에 얼마나 부하를 줄까?성능테스트 2024. 10. 7. 01:00
대상 독자spin lock에 대해서 알고 싶으신 분들 spin lock이 실제 cpu에 얼마나 부하를 주는지 궁금하신 분들 개요소프트웨어를 개발하거나, 외부 라이브러리들을 활용하다 보면 종종 spin lock으로 구현되어 있는 경우를 발견할 수 있습니다. 이런 경우 while 등의 반복문을 활용해서 매번 체크하는 로직이 포함되는데 spin lock은 cpu에 부하를 주지 않을까? 라는 궁금즘이 생겼습니다. 만약 spin lock 방식을 소프트웨어에 활용하면 cpu에 얼마나 부하를 줄게 될까요? Spin Lock이란 무엇인가?fun getLock() { while(true){ if(락 획득) return else 반복하면서 락 획득 시도 }} spin lock은 임..