728x90
반응형

1. 개요

마이크로서비스 아키텍처와 같이 작은 서비스들로 이루어진 환경에서 복잡한 트랜잭션과 데이터 일관성을 효과적으로 관리하기 위해 SAGA 패턴이 사용됩니다. 이 패턴은 여러 서비스 간의 트랜잭션을 조율하고 데이터 일관성을 유지하기 위한 강력한 도구로 활용됩니다.

 

분해된 큰 트랜잭션:

SAGA 패턴은 큰 트랜잭션을 작은 단위의 작업으로 분해합니다. 각 작업은 개별적인 서비스로 구현되며, 작은 범위의 트랜잭션을 조율하는 것이 가능해집니다.

 

단위 작업의 트랜잭션:

각 단위 작업은 자체적인 트랜잭션을 가집니다. 이러한 작은 트랜잭션은 각 서비스 내에서 안전하게 수행

될 수 있습니다.

 

SAGA 관리 로직:

SAGA 패턴은 전체 트랜잭션의 흐름을 관리하는 로직을 필요로 합니다. 이 로직은 각 단계의 작업이 순차적으로 진행될 수 있도록 조율하며, 작업의 완료 여부를 확인합니다.

 

복잡한 트랜잭션의 관리:

다중 서비스 간의 복잡한 트랜잭션을 분해하고 조율함으로써 전체 시스템의 확장성과 견고성을 높일 수 있습니다.

 

구현의 복잡성과 주의사항:

SAGA 패턴은 구현이 복잡하며, 각 작업이 성공적으로 완료되지 않을 경우 컴펜세이팅 트랜잭션을 관리해야 합니다. 따라서 신중한 계획과 테스트가 필요합니다.

 

2. 종류 

 

추가/수정 패턴 (Compensating Transaction Pattern): 

이 방식은 특정 작업에 대한 성공적인 완료가 보장되지 않을 경우, 이전 작업을 취소하는 로직을 구현합니다. 이전 작업을 취소하는 로직을 "보상 트랜잭션" 또는 "컴펜세이팅 트랜잭션"이라고 합니다. 이러한 컴펜세이팅 트랜잭션들이 순차적으로 실행되며, 일련의 작업들의 트랜잭션을 조율하게 됩니다.

 

사가 로깅 패턴 (Saga Logging Pattern): 

이 방식은 각 단계의 트랜잭션 상태와 진행 여부를 기록하는 로깅 메커니즘을 사용하여 트랜잭션의 상태를 추적합니다. 각 작업이 시작되고 완료될 때 로그를 남기고, 다음 작업으로 진행 여부를 확인할 수 있도록 합니다.

 

3. 장단점

 

장점

분산 시스템에서 트랜잭션 조율: 마이크로서비스 아키텍처와 같은 분산 시스템에서 여러 서비스 간의 트랜잭션을 조율하는데 유용합니다. 각 서비스의 트랜잭션을 분리하여 더 작은 범위에서 관리하고, 전체 시스템의 유연성과 확장성을 향상시킵니다.

부분 실패에 대한 대응: 일부 서비스에서 오류가 발생하여 트랜잭션이 실패할 경우, 해당 작업만 롤백하고 다른 작업은 계속 진행할 수 있습니다. 이로써 전체 트랜잭션을 망가뜨리지 않고 일부 실패를 처리할 수 있습니다.

변경의 용이성: 각 단위 작업은 개별적인 서비스로 구현되므로, 각 서비스의 변경이 다른 서비스에 영향을 덜 주며 유지보수가 용이합니다.

 

단점

구현 복잡성: SAGA 패턴은 복잡한 구조를 가지며, 작은 단위의 트랜잭션과 그에 따른 컴펜세이팅 트랜잭션을 구현해야 합니다. 이로 인해 개발과 유지보수가 어려울 수 있습니다.

컴펜세이팅 트랜잭션 처리의 어려움: 각 작업이 성공적으로 완료된 후 다음 작업으로 진행하는 것이 아니라, 중간에 실패할 경우 이전 작업을 롤백하고 컴펜세이팅 트랜잭션을 실행해야 합니다. 이런 컴펜세이팅 트랜잭션의 구현은 복잡하고 예외 처리가 중요합니다.

장애 복구 어려움: 트랜잭션 조율 중에 실패가 발생하거나 일부 서비스가 다운되면 전체 SAGA 트랜잭션이 실패할 수 있습니다. 이러한 상황에서의 복구 작업은 복잡하고 신중한 처리가 필요합니다.

응답 시간 지연: 각 작업이 별도의 트랜잭션으로 실행되기 때문에 전체 SAGA 트랜잭션이 완료될 때까지 시간이 걸릴 수 있습니다. 이로 인해 응답 시간이 지연될 수 있습니다.

 

 

SAGA 패턴은 복잡한 분산 시스템에서 효과적인 데이터 일관성과 트랜잭션 관리를 위한 방법이지만, 그 구현과 관리가 쉽지 않을 수 있습니다. 사용 시에는 장점과 단점을 고려하여 상황에 맞게 적용해야 합니다.

728x90
반응형

'이론 정리' 카테고리의 다른 글

Blocking/Non-blocking, Sync와 Async: 개념과 예시  (0) 2023.08.17
[OOP] 객체지향 프로그래밍  (0) 2021.02.27
한글 인코딩  (0) 2019.06.04
가상화 ( IO )  (0) 2018.02.11
가상화 ( 서버 )  (0) 2018.02.11
728x90
반응형

Blocking/Non-blocking, Sync와 Async: 개념과 예시

 

 

자바 프로그래밍에서는 동시성 처리와 작업의 순서에 따라 다양한 작업 처리 방식이 사용됩니다. 이러한 작업 처리 방식을 이해하고 활용하는 것은 프로그램의 효율성과 성능에 큰 영향을 미칩니다. 이번 포스팅에서는 Blocking과 Non-blocking, 그리고 Sync와 Async에 대한 개념과 자바에서 사용되는 라이브러리 예시를 살펴보겠습니다.

Blocking(블로킹)과 Non-blocking(논블로킹)

 

Blocking (블로킹): 

정의
블로킹은 특정 작업을 요청한 함수나 쓰레드가 그 작업이 완료될 때까지 대기해야 하는 상태를 말합니다.
예시
예를 들어, 레스토랑에서 주문을 하면 주문한 음식이 나올 때까지 계속 기다려야 하는 것과 유사합니다. 이러한 상태에서는 주문을 한 사람이 다른 일을 하지 못하고 음식이 나올 때까지 기다려야 합니다.

 

 

Non-blocking (논블로킹): 

정의
논블로킹은 특정 작업을 요청한 후, 그 작업의 완료 여부와 상관 없이 다른 작업을 계속 수행할 수 있는 상태를 의미합니다.
예시
논블로킹 상황에서는 레스토랑 주문을 예로 들면, 주문을 하고 나서 다른 일을 계속 할 수 있습니다. 주문이 처리되는 동안에도 다른 고객이 주문을 할 수 있습니다.

 

Sync(동기)와 Async(비동기)

 

Sync(동기): 
정의
동기는 요청한 작업이 완료될 때까지 다음 작업을 수행하지 않는 방식을 의미합니다. 즉, 한 작업이 끝나야 다음 작업이 시작됩니다.
예시
주문을 처리하는 동안 다른 작업을 처리하지 않고, 그 주문이 끝난 후에 다음 주문을 받는 상황과 유사합니다.

 

 

Async(비동기):

정의
비동기는 하나의 작업이 끝나지 않았더라도 다음 작업을 병렬적으로 처리할 수 있는 방식을 의미합니다.
예시
주문을 비동기 방식으로 처리하면서 다른 요청도 병렬적으로 처리하는 상황과 유사합니다.


 

이렇게 보면, 'Blocking'과 'Sync', 그리고 'Non-blocking'과 'Async'가 서로 비슷한 개념처럼 보이지만, 사실은 각각 다른 측면을 다루고 있습니다. 'Blocking'과 'Non-blocking'은 작업을 어떻게 대기하는지, 'Sync'와 'Async' 는 작업을 어떻게 처리하는지에 초점을 맞춥니다.

 

즉, 'Blocking'과 'Sync'는 대기하는 방식과 작업 처리 방식에서 차이가 나지만, 결국에는 둘 다 '대기'를 의미합니다. 반면, 'Non-blocking'과 'Async'는 각각 대기하지 않고 다른 작업을 병렬로 처리할 수 있는 방식을 나타냅니다.

 

자바 사용 예시

1. Blocking

java.io 패키지: InputStream 및 OutputStream 클래스는 블로킹 방식으로 입출력 작업을 처리합니다.

 

2. Non-blocking

java.nio 패키지: ByteBuffer, Channel, Selector 등을 통해 비동기 입출력 작업을 처리합니다.

 

3. Blocking Sync
java.util.concurrent 패키지: Semaphore, CountDownLatch, CyclicBarrier 등을 사용하여 동기화 기능을 구현할 수 있습니다.

 

4. Non-blocking Async
CompletableFuture: 자바 8부터 제공되는 CompletableFuture를 활용하여 비동기 작업을 처리합니다.

java.util.concurrent 패키지: ExecutorService, ScheduledExecutorService 등을 통해 비동기 작업을 처리하는 방식을 구현할 수 있습니다.

 

실제 예시로 살펴보기

1. 블로킹 동기 (Blocking Sync): 식당에서 주문을 받을 때 주문이 완료될 때까지 주문한 사람은 대기합니다.

2. 논블로킹 동기 (Non-blocking Sync): 식당에서 주문이 처리되는 동안에도 다른 손님이 주문을 할 수 있습니다.

3. 블로킹 비동기 (Blocking Async): 웹 서버에서 클라이언트의 요청을 처리하는 동안 다른 요청을 처리하지 않습니다.

4. 논블로킹 비동기 (Non-blocking Async): 웹 서버에서 클라이언트의 요청이 처리되는 동안에도 다른 요청을 처리할 수 있습니다.

 

자바에서는 위와 같은 라이브러리와 패키지를 활용하여 다양한 작업 처리 방식을 구현할 수 있습니다. 이를 통해 다양한 상황에 맞게 동작하는 프로그램을 개발할 수 있습니다.

 

 

728x90
반응형

'이론 정리' 카테고리의 다른 글

SAGA 패턴  (0) 2023.08.22
[OOP] 객체지향 프로그래밍  (0) 2021.02.27
한글 인코딩  (0) 2019.06.04
가상화 ( IO )  (0) 2018.02.11
가상화 ( 서버 )  (0) 2018.02.11
728x90
반응형

환경 : SpringBoot 2.7, Intellij

목표 : profile 환경 변수를 기준으로 서로 다른 Property 를 적용

 

1. spring.config.activate.on-profile 을 사용하여 적용될 profile 을 명시

 

application.yml

default:
  string: default

custom:
  string: noProfile

application-custom.yml

custom:
  string: custom

spring:
  config:
    activate:
      on-profile: custom

application-local.yml

spring:
  config:
    activate:
      on-profile: local

 

 

 

2. 적용할 profile 환경 변수 설정

 

Edit Configurations -> Active profiles 설정

 

 

 

3. 결과

 

3.1) profile 설정 X

default.string = default

custm.string = noProfile

 

3.2) profile : local

default.string = default

custm.string = noProfile

 

3.3) profile : custom

default.string = default

custm.string = custom

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[SpringBoot] Gradle 변수 Property 활용  (0) 2022.05.30
[MyBatis] List 형식 멤버 변수 조회  (0) 2021.02.12
[Spring] Web Cache 적용  (0) 2020.12.19
[SpringBoot] H2 연동  (0) 2020.07.21
[Spring] App 구동 후 자동 작업 실행  (0) 2020.02.23

+ Recent posts