스프링(17)
-
spring 환경에서 redis pub-sub을 이용한 멀티 캐스팅
도입 계기 기존에 대기자를 매칭하는 서비스를 제작하고 있었다. 해당 서비스는 SSE(Server Sent Event)로 구현하며, 각 서비스가 Sink 상태를 직접 관리하였다. 문제는 서비스가 Sink를 관리하다보니 스케일 아웃 진행시에 각 확장 서버가 대기자를 동기화가 되지 않는 문제가 있었다. 대기자를 동기화하기 위해서 새로운 대기자가 생기면 각 서버에 multicasting 하는 방법을 구상했다. 멀티 캐스팅이란? 네트워크에서 그룹으로 지정된 여러 대상에게 대이터를 전송하는 방식. 송신자는 그룹에 데이터를 전송하고, 해당 그룹에 가입된 수신자만 데이터를 수신하는 구조. redis pub-sub란? 인메모리 DB인 redis는 publish-subscribe 메시징 패턴을 지원하여 메시지를 발행하고 ..
2023.07.15 -
Spring Webflux 및 MVC Security환경 비교
개인적으로 느끼기에는 구조 자체는 MVC 환경 Security와 비슷하다. 허나 반환 형식이랑 체인 설정법만 조금씩 다른 느낌이다. SecurityConfig MVC 환경 @Configuration @EnableWebSecurity @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class SecurityConfig { JwtAuthenticationFilter jwtAuthenticationFilter; @Bean public SecurityFilterChain configure(HttpSecurity http) throws Exception { return http.authorize..
2023.07.15 -
Spring webflux를 활용한 SSE(Server Sent Event) 구현
SSE(Server Sent Event) 란? 서버의 데이터를 실시간으로 스트리밍 하는 기술 HTTP프로토콜 기반 text/event-stream 미디어 타입 사용 클라이언트와 서버가 최초 한 번 HTTP 연결 후 서버가 클라에게 지속적으로 데이터 전송 단방향 통신, 실시간 업데이트, 자동 재연결 기능 제공 spring에서 SSE 구현 방법 SseEmmiter Spring MVC에서 SSE를 구현하는 스택. 간단하게 사용 가능하고 스레드 기반으로 동작하나, 높은 리소스 사용하고 확장성에 제한이 있음 https://github.com/phjppo0918/SseEmitter-sample GitHub - phjppo0918/SseEmitter-sample Contribute to phjppo0918/SseEm..
2023.07.15 -
Spring Webflux - Scheduler
Scheduler란 Reactor Sequence에서 사용되는 스레드를 관리해주는 관리자 주요 역할 스레드 관리 비동기 작업을 실행할 스레드 풀을 관리 별도의 스레드에서 실행되며, 블로킹되지 않고 비동기적으로 처리 작업 스케줄링 비동기 작업 실행을 스케줄링. 즉시/지연/주기적 실행 등 다양한 옵션 제공 백프레셔 관리 백프레셔 : Publisher와 Subscriber 간 데이터 흐름 제어, 작업 속도를 조절하여 효율적 데이터 처리를 가능하게 함 Scheduler 전용 Operator subscribeOn(), publishOn() 이 Scheduler 전용 Operator임 적절한 Scheduler를 전달하면 해당 특성에 맞는 스레드가 Reactor Sequence에 할당 subscribeOn() 구독이..
2023.07.15 -
Spring Webflux Sink
Sinks란? Reactor에서 Processor(Publisher + Subscriber) 을 개선한 구현체 Signal을 프로그래밍 방식으로 푸시 Flux 및 Mono의 의미 쳬계를 가짐 멀티 스레드 방식으로 Signal을 전송해도 스레드 안정성 보장 Sinks 사용 방법 Sinks.One 한 건의 데이터를 전송 Mono 방식으로 Subscriber가 데이터를 소비할 수 있도록 함 @Test @DisplayName("mono test") void sinkTest() { Sinks.One sinkOne = Sinks.one(); Mono mono = sinkOne.asMono(); sinkOne.emitValue("Hello", Sinks.EmitFailureHandler.FAIL_FAST); mono..
2023.07.15 -
Reactive programming - Spring webflux
리액티브 프로그래밍 - 데이터가 변경될 때마다 이벤트를 발생시켜 데이터를 계속적으로 전달하는 것 - 실행할 동적을 구체적으로 명시하는 명령형 프로그래밍과 달리 단순히 목표(함수)를 선언 Webflux 비동기적인 웹 애플리케이션을 개발하기 위한 모듈 더 많은 동시 요청 처리, 더 빠른 응답 시간과 확장성 제공 reactor 반응형 스트림 라이브러리 기반 동작 동기 / 비동기 요청한 작업에 대해 완료 여부를 신경써서 작업을 순차적으로 수행하는지 여부 동기 : 다른 작업을 요청한 후 해당 작업이 완료되면 바로 해당 작업을 진행(완료가 되면 즉시 처리) 비동기 : 작업을 요청되고 완료를 기다리지 않고 다른 작업을 실행(한 작업이 완료되기를 기다리지 않고 다른 작업 실행, 완료가 되어도 즉시 처리하지 않음) 작업..
2023.07.14