대머리개발자

리액터 병렬 처리 본문

개발이야기/개념

리액터 병렬 처리

대머리개발자 2024. 5. 10. 12:47
728x90

몇 명 사용하지 않는 시스템이긴 하지만 ㅋ

앞으로의 미래를 위해서 미리미리!!미리뽕

 

하나의 프로세스에서 부가(추가)적인 작업을 해야하는 경우가 종종있다.

아니 많이 있다. ㅎㅎ 

 

메인 프로세스와 별개로 작업하는 경우 병렬적으로 처리한다면 너무나도 효율적!!이다.

 

예를들어 로그인 과정에서

1. "로그인에 대한 이력"

2. "마켓팅 여부 확인"

3. "로그인에 대한 포인트 적립 처리"

4. ...

5. ...

기본적인 사용자 정보를 Return 하는 부분하고는  연관성이 없기 때문에.

 

모든 과정을 처리하는 동안 wait 할 필요가 없다.

0.05초의 과정이지만 ㅋ.. 티끌ms가 모여서 초로 바뀐다.

 

어플리케이션 로그인 속도 1초를 줄이기 위한 연간 과제도 있다고 하는데..

이런 요소들을 찾아서 병렬로 처리한다면 굳굳!!

 

로그인 이력과 동의 여부의 로직과 상관없이..토큰을 만들어 리턴한다!!

checkAndGetUser(toProto(naverResponse))
.flatMap(user -> Mono.fromCallable(()->{
    // 로그인 이력
    ServiceUtil.getLoginService().create(Login.builder()
            .userAgent(findAgent(Objects.requireNonNull(context.request().headers().get("user-agent"))))
            
    return user;
})
.subscribeOn(Schedulers.parallel()))
.flatMap(user -> Mono.fromCallable(()->{
    if( "New".equals(user.getState())) {
        // 동의 여부
        HttpRequest agreeRequest = HttpRequest.get("https://...")
                .authorization("Bearer " + naverResponse.getNToken());

        if (agreeRequest.ok() && agreeRequest.body().contains("marketing")) {
            ServiceUtil.getUserRoleService().createMarketing(user.getUid());
        }
    }
    return user;
}))
.flatMap( ..... ){ ... }
.subscribeOn(Schedulers.parall()))
 .map(user -> {
                Oauth2Token oauth2Token = ServiceUtil.getJwtService().generatorJwt(AuthorizationRequest.builder()
                        .user(user)
                        .client(client)
                        .build());
                        ..
})

 

 

결국 Mono.fromCallable(() -> ... ) 을 통해서 추가 작업이나 무거운 작업들을 백그라운드로 별도 쓰레드로  진행할 수 있다.

 

논블락킹!! 예압!

 

같은 아웃풋이 나오지만...우아하게 해보자...

728x90

'개발이야기 > 개념' 카테고리의 다른 글

[리액티브] map vs flatMap 와우..진짜.  (1) 2024.06.12
비동기와 논블로킹, 리액티브  (0) 2024.06.07
JWT 사실 어려운 친구였다.  (0) 2024.04.26
Json 안에 Json 처리  (0) 2024.04.25
네이밍 너무 힘들다.  (1) 2024.04.19