Persitence는 다음과 같은 사전적의미를 가지고 있습니다.
상태(Data or State)를 저장하고 유지한다는점에서 IT전반적으로 사용되어지는 단어입니다.
RDBMS는 안정적이고 범용적으로 그러한 목표를 이루어내는 대표적인 장치입니다.
대용량분산처리를위해 DB사용을 줄이는 탈중앙화가 이루어지고 있고, DB에 저장되기 전까지
각각의 분산된 객체의 상태를 어떻게 유지하고 복구를 할것인가?
사용하는 장치마다 조금씩 다른 의미를 가지고 있습니다.
장치별로 정리해본 영속성의 개념
- persitence in Router : 웹호출시 노드가 변경안되도록 라우터가 IP기반으로 목적지를 유지해줍니다.
- persitence in redis : 메모리DB인 redis의 상태가 휘발되지 않게 IO장치에도 저장하는 기능입니다.
- persitence in JPA : 준영속상태 , Lazy Update방식등을 사용하여 효율적인 CRUD를 제공합니다. ( JPA Repository CRUD )
- persitence in AKKA : 실시간 메시지에 영속성을 부여하여, 장애후에도 마지막 상태를 복구하도록 해줍니다.
AKKA내에서 Persitence의 개념은 실시간 메시지 처리를 하면서 변경되는 액터의 상태를
유지하는 장치라고 간단하게 요약을 하겠습니다.
StateFul VS StateLess
Persitence를 이해하기 앞서 먼저 정리하고 넘어가야하는 개념입니다.
동시성및 병렬처리 주제만큼 중요한 공통 주제이며 웹서비스에서도 이 두가지가 공존하고
상호 운영이 된다란점이며, 그 차이를 인지하지 못한다면 분산처리 목적을 달성하는것은 불가능할것입니다.
private int total; int IncreaseValue(int add){ return total+=add; } int SumValue(int x,int y){ return x+y; }
StateLess-상태가없는
SumValue와 같이 함수를 호출한후, 호출한 횟수에 의해 결과값에 영향을 미치지 않는 케이스입니다.
DB를 호출하여 그대로 재생하는 RestfulAPI를 한가지 예로 볼수가 있으며 다음과 같은 특징이있습니다.
- 상태가 없기때문에 캐싱및 분산에 용이하나, 폴링을 통해 전체를 요구하기때문에 성능에 항상 좋다라고 볼수는 없습니다.
- 상태가 없는것을 보완하기위해, 사용자별로 상태가 있는 쿠키를 이용하기도 합니다.
- RestAPI 도 상태가 있을수 있습니다. 게임진행가능한 턴제게임 API가 대표적인 예입니다.
StateFul-상태가 있는
IncreaseValue와 같이 함수를 호출한것만으로, 횟수에따라 상태를 변경할수 있기때문에 결과값에 영향을 줍니다.
연결이되고나서 종료될때까지, 자신의 상태값을 계속 변경할수있는 연결지향형 웹소켓 서비스가 이에 해당할수가 있습니다.
- 사용자별로 상태가 있기때문에 스케일 아웃 하기가 어렵습니다. ( 변경된 상태를 다른 노드에도 알릴수 있는 장치가 필요)
- 상태가 있기때문에 그것을 복원하기위해 세션 까지고려한 Persitence 장치가 필요합니다.
- 웹소켓도 상태가없는 데이터만 받을수 있습니다. 요청-응답의 한쌍이 특정 저장소에 있는 내용을 항상 반환하는 경우입니다.
StateFul이 왜 필요한가?
위 비교를 보면 StateLess가 장점이 많은 개발방식으로 보이지만, 그 차이를 이해하고 적합한 방식을 사용해야합니다.
서비스에서 수많은 행동과 메시지가 실시간으로 오고가며 그속에는 중요한 정보가 포함될수도 있으나
일반적으로 휘발이 됩니다. 이것을 모두 저장하거나, 필요할때만 저장하거나 다양한 전략을 사용하기위해서는
특정 시점까지 정보를 누적해야할 필요가 있으며, 상태가 관리되고 유지되어야할 필요가 있습니다.
이것이 상태가 있는 서비스 설계가 어려운 이유중에 하나이며, DB를 통해 모든것을 할수있겠지만
초당 수십만건의 이벤트를 단일 DB를 통해 모두 기록하려는것은 무모합니다.
AKKA의 관점에서 본다고하면, 우리가 설계한 액터는 특정사용자의 요청/응답보다 더 오랜시간 존재할수 있으며 시간이 지남에따라
중요한 정보가 누적될수가 있습니다. DB를 통하지 않고 수천개의 실시간 메시지를 처리하면서 성능에 영향을 끼치지 않는 타이밍에
누적된 내용을 압축하거나 집계하여 DB에 저장도 할수가 있습니다.
AKKA에서는 실시간 액터메시지에 영속성을 부여하기위해 이벤트소싱/스냅샷/유실없는메시지전송 등의 장치를 제공해줍니다.
Akka Persitence 의 목적은, 상태변경 기록이 보장이 되지 않거나 어려운 상태를 가지는 어떠한 상태가 존재하는 객체
설계를 저장소와(RDB,파일,기타장치) 연동되어 몇가지 전략적 선택으로 기록및 복구를 보장하는데 있습니다.
Redis를 사용해보셨다면, 이러한 Persitence 목적이 동일함을 알수 있으며
Akka의 Persitence를 이해하는데 도움이됩니다.
참고자료:
https://nordicapis.com/defining-stateful-vs-stateless-web-services/