Page History
...
Persitence를 이해하기 앞서 먼저 정리하고 넘어가야하는 개념입니다.
동시성및 병렬처리 주제만큼 중요한 공통 주제이며 웹서비스에서도 이 두가지가 공존하고
상호 운영이 된다란점이며, 그 차이를 인지하지 못한다면 분산처리 목적을 달성하는것은 불가능할것입니다.
Code Block | ||||
---|---|---|---|---|
| ||||
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를 통해 모두 기록하려는것은 무모합니다. 사용해야 필요가 있습니다. 이것을 모두 DB에 업데이트하고 조회하려면 병목지점이 생기게마련입니다.
AKKA의 관점에서 본다고하면, 우리가 설계한 액터는 특정사용자의 요청/응답보다 더 오랜시간 존재할수 있으며 시간이 지남에따라
중요한 정보가 누적될수가 있습니다. DB를 통하지 않고 수천개의 실시간 메시지를 처리하면서 성능에 영향을 끼치지 않는 타이밍에
누적된 내용을 압축하거나 집계하여 DB에 저장도 할수가 있습니다.
AKKA에서는 실시간 액터메시지에 영속성을 부여하기위해 이벤트소싱/스냅샷/유실없는메시지전송 등의 장치를 제공해줍니다.
Note |
---|
Akka Persitence 의 목적은, 상태변경 기록이 보장이 되지 않거나 어려운 상태를 가지는 어떠한 상태가 존재하는 객체 설계를 저장소와(RDB,파일,기타장치) 연동되어 몇가지 전략적 선택으로 기록및 복구를 보장하는데 있습니다. Redis를 사용해보셨다면, 이러한 Persitence 목적이 동일함을 알수 있으며 Akka의 Persitence를 이해하는데 도움이됩니다. |
참고자료:
https://nordicapis.com/defining-stateful-vs-stateless-web-services/