본문 바로가기

분류 전체보기

(120)
Transactional Messaging Messaging 서비스에서 데이터를 변화시킴에 따라, 두가지 액션이 일어납니다. 데이터의 상태 변화 데이터 변화에 대한 전파 이 두 액션은 한 트랜잭션 내에서 Atomic하게 처리되지 않으면 애플리케이션 안정성이 떨어집니다. 하지만 메시지 브로커는 DB 트랜잭션을 함께 사용할 수 없습니다. 그렇다면 데이터 변화와 메시지 발행을 확실하게 보장하려면 어떻게 해야하느냐. Transactional Outbox Pattern 기존 서비스 Outbox 역할을 하는 테이블을 생성하고, 상태를 변화시키는 트랜잭션의 일부로 OutBox 테이블에 메시지를 Insert 시키는 것입니다. 이렇게 하면 하나의 DB 트랜잭션 내에서 Atomicity 는 보장이 됩니다. Message Relay Outbox 테이블은 메시지 발행..
HTTP 요청 흐름의 이해 (번역) Understand the Flow of a HTTP Request 를 번역한 글 입니다. 브라우저에서 엔터 키를 눌렀을 때, 무슨 일이 일어나는 지 궁금한 적이 있는가? 이 아티클은 개발자의 관점에서, 개발자가 알아야 할 'HTTP 요청이 수행될 때 일어나는 일'에 대해 알려준다. HTTP가 단순히 Document 전송 프로토콜일지라도, 본질적으로 인터넷의 근간이 된다. HTTP 요청은 주소창에 URL을 입력하거나, 앱, 웹사이트 또는 다른 프로그램을 이용하는 것으로 요청이 시작되고, 응답을 수신하면 끝이 나는데, 이 사이에 마법이 일어난다. 이것이 우리가 전형적으로 HTTP 요청을 이해하는 방식이다.(과하게 표현하면) 우리 시스템에서 app.mydomain.com/me 를 열었다고 해보자. 브라우저는..
Is Redis-connection-pooling necessary ? (lettuce) 기본적으로 Blocking, Single Thread 이다 Lettuce 는 여러 스레드 사이에서 하나의 connection을 공유하더라도 thread-safe 하게 동작하도록 설계되어 있으며, auto-reconnection설정도 defualt이다. 그래서 대부분의 경우에는 Connection pooling이 필요없다. 또한 어차피 모든 레디스 사용자 Operation은 싱글 스레드기반으로 수행되기 때문에, 여러 커넥션을 사용한다 하더라도 어플리케이션 성능이 좋아지지도 않는다. 그러면 언제 유용한가? 제한적으로 사용되며, 당연히 복잡도와 유지보수의 비용은 들어간다. Redis의 blocking operation은 보통 해당 워커스레드에서 물고있는 커넥션을 통해 수행되는데, 그렇다면 커넥션을 필요로 하는..
Kotlin-Spring plugins Kotlin이 Java와 100% 호환이 된다지만, 약간의 불편을 감수해야 하는 것 같다. 특히 뗄래야 뗄 수 없는 java-spring의 관계를 kotlin에서도 동일하게 가져가려면 좀 귀찮다. spring의 구현 특성상 ltw가 많다. 그러나 kotlin의 클래스 확장 기본값은 final 이다. 때문에 spring에 의존적인 클래스는 대부분 open class 로 열어줘야한다. 이를 도와주기 위한 kotlin-spring plugins 이 있는데, 아래와 같다. The plugin specifies the following annotations: @Component @Async @Transactional @Cacheable and @SpringBootTest. Thanks to meta-annotat..
프로메테우스 Getting error "expected label name, got \"BCLOSE\"" Error 문제 새로운 서비스를 올렸는데 프로메테우스가 서비스 Metric 집계에 실패하고 있었다. 로그를 확인 해 보니 Getting error "expected label name, got \"BCLOSE\"" Error curl로 응답을 했을 때 정상적으로 데이타들이 넘어왔다. 그런데 이 데이타들을 프로메테우스가 인지를 못하는 것. 해결 produces = ["text/plain; version=0.0.4"] 로 content-type을 지정해 주어야한다. @GetMapping("/metrics", produces = ["text/plain; version=0.0.4"]) fun metrics(): String? = prometheusMeterRegistry.scrape()
DBCP maxLIfeTime Issue Error Msg Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@17061015 (No operations allowed after connection closed.)Possibly consider using a shorter maxLifetime value. 즉, Pool 내의 Connection을 validate 해보니, DB에서 이미 해당 커넥션을 종료시켰기 때문에 발생하는 에러이다. public class HikariConfig implements HikariConfigMXBean { private static final Logger LOGGER = LoggerFactory.getLogger(HikariConfig.class); p..
카프카 개요 1. 카프카 디자인의 특징 분산시스템 : 동일한 역할을 하는 서버를 추가하여 부하를 분산할 수 있다. 페이지 캐시를 이용한다 카프카 - 페이지캐시 - 디스크 작은 단위의 I/O를 묶어서 배치로 처리 2. 카프카 데이타 모델 2.1 토픽(Topic) 카프카 클러스터는 토픽에 데이타를 저장한다. 2.2 파티션(Partition) 토픽을 분할한 단위이다. 파티셔닝을 통하여 병렬처리가 가능하다. 단, 메시지의 순서는 각 파티션 내에서만 보장되며 파티션 사이의 순서는 보장하지 않는다. 파티션 수가 많으면 좋은가 ? 당연히 무조건 많다고 좋은 것은 아니다. 파티션 수가 많아짐에 따라 생기는 문제점이 있다. 파일 핸들러가 낭비될 수 있다. 장애 복구시간 증가 나중에 다루겠지만, 미리 언급하자면 카프카는 고가용성을 위..
코틀린 스터디 킥오프 코틀린의 주요 특성 JetBrains의 R&D 센터가 위치한 상트페테르부르크 근처의 코틀린(Ко́тлин) 섬에서… 블라블라 JVM 기반 언어로, 자바와 100% 상호운용성을 제공한다. 즉, 자바가 사용되는 모든 곳에서 이용 가능하다. 자바에 비하면 훨씬 간결하고 생산성 높고 안전하다 정적 타입 지정 언어 성능, 신뢰성, 유지보수, IDE 기능 활용 OOP와 FP의 특성을 지닌다. FP의 특성? First-class function : Function을 일반 값처럼 다룰 수 있다. 변수에 할당할 수 있고, 전달도 가능하다. 함수에서 새로운 함수를 생성하여 반환할 수도 있다. Immutability : 기본적으로 불변객체이다 No side-effect 코틀린이 지향하는 바는 ? 실용적이어야 한다. 간결해야..