Reactive Programming 데이터 흐름과 전달에 관한 프로그래밍 패러다임 리액티브 스트림을 사용하는 프로그래밍 리액티브 스트림 잠재적으로 무한정 들어올 수 있는 비동기 데이터를 순서대로, 그리고 블록하지 않고 (non-blocking) 역압력(backpressure, 배압, 메세지를 받는 쪽에서 보내는 쪽으로 지속적으로 메세지를 처리할 수 있는지 알려 요청의 양을 조절하는 기술)으로 처리하는 표준 기술 엽압력 (배압, Backpressure) 발행 - 구독 프로토콜에서 이벤트 스트림(발행쪽)의 구독자가 발행된 이벤트를 처리하는 속도보다 느린 속도로 이벤트를 소비하면서 문제가 발생하지 않도록 보장하는 장치이다. 왜 이런 패러다임이 생겼나? 빅데이터/모바일부터 클라우드 기반 클러스터에 이르는 다양..
정의 non-blocking, backPressure 를 이용해서 비용기 서비스를 할 때 기본이 되는 스팩이다. Java RxJava, Spring5 Webflux의 Core 에 있는 ProjectReactor 프로젝트 모두 해당 스팩을 사용하고 있습니다. 따라서 비동기 프로젝트를 잘 이해하기 위해서 기본 스펙이 되는 Reactive Stream 에 대한 이해가 필요하다. 개요 non-blocking backpressure 를 이용하여 비동기 스트림 처리의 표준을 제공하는 것 목적, 설계, 범위 지속적으로 들어오는 스트림 데이터를 효율적으로 처리하기 위해서는 비동기 시스템이 효과적이다. 비동기 처리를 하면서 가장 중요한 문제는 데이터 처리가 목적지의 리소스 소비를 예측가능한 범위에서 신중하게 제어할 수 ..
IO 장치들은 여러 문제가 있음. 다양한 주변 장치가 존재 서로 다른 포멧의 데이터를 전송 서로 다른 속도로 동작 CPU 와 RAM 보다 I/O 작업이 느림 입출력 모듈을 필요로 한다. 여기서 입출력 모듈이란 CPU 와 메모리의 인터페이스이고 하나 또는 그 이상의 주변 장치에 대한 인터페이스를 의미 Programmed I/O (프로그램 입출력) 입출력 모듈 중에 프로그램 입출력은 IO 로 부터 제어권을 CPU 가 가져와서 작업을 진행하는 것으로 CPU 는 입출력 모듈이 명령어의 수행을 완료할 때까지 기다립니다. 따라서 이 방식은 CPU 의 시간을 소모합니다. Java I/O 는 이런 문제점 때문에 파일 입출력이 느리다는 인상을 많이 주었음. 이런 문제점을 Non-blocking IO(nio, New IO..
자바 가비지컬렉터. 강한참조 (String Reference), 약한참조 (Weak Reference)
2022.03.03
가비지컬렉터 Java의 가비지 컬렉터는 많은 종류가 있지만 크게 두가지 작업을 공통적으로 수행합니다. 힙 메모리 내의 객체 중 가비지를 찾아낸다. 찾아낸 가비지를 처리해서 힙 메모리를 회수한다. 최초의 Java 에서는 이들 가비지 컬렉션 작업에 사용자 코드가 관여 하지 않도록 구현되어 있었습니다. 좀 더 다양한 방법으로 객체를 처리하려는 요구가 있었고 이에 따라 JDK 1.2 부터 java.lang.ref 패키지를 추가해서 제한적이나마 사용자 코드와 GC가 상호작용 할 수 있게 했습니다. java.lang.ref 패키지는 객체를 new로 생성했을 때 생기는 string reference 이외에도 soft, weak, phantom 3가지의 새로운 참조 방식을 각각의 Reference 클래스로 제공합니다...
참고 https://techblog.woowahan.com/2664/ HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그 {{item.name}} 안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로 HikariCP에서 Dead lock이 발생할 수 있는 case와 Dead lock을 회피할 techblog.woowahan.com https://techblog.woowahan.com/2664/ HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그 {{item.name}} 안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로..
참고 https://www.ibm.com/kr-ko/cloud/learn/message-brokers Message Broker(메시지 브로커)는 Publisher(송신자)로부터 전달받은 메시지를 Subscriber(수신자)로 전달해주는 중간 역할이며 응용 소프트웨어 간에 메시지를 교환할 수 있게 한다. 애플리케이션 To 애플리케이션으로 직접 메세지를 송수신 하는 방식과 비교해, 애플리케이션 간의 결합을 낮추고 확장에 보다 더 유연하게 대처할 수 있다는 장점이 있다. 메세지 브로커는 메세지를 전달하는 방식에 따라서 크게 2가지 종류가 있다. 포인트-투-포인트 메시징 메시지의 송신자와 수신자 간에 일대일 관계를 지닌 메시지 대기열에서 사용되는 분배 패턴입니다. 큐의 각 메시지는 하나의 수신자에게만 전송되며..
동시성을 고려한 프로그래밍 코드를 짜면 동시성에 대해서 늘 고민하게 된다. 여러 WAS 가 동시에 이 코드를 실행 했을 때 이 후 API 나 배치 등등의 작업이 어떻게 될 것인가? 동시에 같은 row 를 select 한 후 상태를 검사하고 다음 코드를 실행하면 어떤 상황이 되는지 고민을 많이 하게 된다. 예를 들어서 인증을 위한 램덤 코드를 생성한다고 가정하자. code 값이 DB에서 unique 제약 조건이 걸려있고 이 때문에 값을 insert 할 때 만든 랜덤의 코드값으로 DB 를 조회하고 이 값이 없으면 insert 를 해서 코드를 생성하는 코드를 짰다. 이 코드에 동시성 처리를 해주지 않으면 어떻게 될까? 고민을 했다. 만약 랜덤의 코드 값을 생성했는데 이 코드가 중복된 코드는 아니고, 서로 다른..
참고 https://github.com/donghyeon0725/jpaTest GitHub - donghyeon0725/jpaTest Contribute to donghyeon0725/jpaTest development by creating an account on GitHub. github.com JPA 에서 변경 감지가 동작하려면 다음과 같은 조건이 필요합니다. 명시적인(선언적인) 트랜잭션을 열어야 한다. (이 때 선언적인 @Transactional 이 존재해야하고, 이 트랜젝션이 commit 되는 시점에 변경 감지가 일어난다.) 영속성 관리중인 객체에 데이터 변경이 일어나야 한다. 일반적으로 Service 에서 트랜잭션(@Transactional)을 열고 Service 에서 변경감지로 JPA Ent..
( datadog에서는 검색될 값을 용어라고도 부르고 태그라고도 부르는 것 같음 ) 데이타독의 로그 검색은 용어와 연산자를 통해서 진행 그리고, 용어에는 두가지 유형이 존재 single term ( 단일 용어 ) sequence ( 시퀀스, 연속 용어 ) single term 띄어 쓰기 단위로 구분된 모든 단어. 예를 들어서 test hello 는 test와 hello 로 이루어진 single term. 다음과 같은 연산자를 사용해 조건을 추가할 수 있다. 연산자 설명 예시 AND 두 용어 모두 포함한 로그 검색 test AND hello OR 둘 중 하나 용어 포함한 로그 검색 test OR hello - 이 연산자 다음에 오는 용어는 이벤트에 포함되지 않습니다. (test 는 포함하되, hello 는..