You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

Persitence는 다음과 같은 사전적의미를 가지고 있습니다.

(lightbulb) 상태(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에서 사용되는 단어이며, 분산환경에서 액터의 상태를 유지해줍니다.

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를 한가지 예로 볼수가 있으며 다음과 같은 특징이있습니다. 

  • 상태가 없기때문에 캐싱및 분산에 용이하나, 병목지점이 있기때문에 성능에 항상 좋다라고 볼수는 없습니다.
  • 상태가 없는것을 보완하기위해, 사용자별로 상태가 있는 쿠키를 이용하기도 합니다. 

StateFul

IncreaseValue와 같이 함수를 호출한것만으로, 상태를 변경할수 있기때문에 결과값에 영향을 줍니다.

 연결이되고나서 종료될때까지, 자신의 상태값을 계속 변경할수있는 연결지향형 웹소켓 서비스가 이에 해당할수가 있습니다.

  • 사용자별로 상태가 있기때문에 스케이아웃이 용이하지 않습니다.
  • 상태가 있기때문에 그것을 복원하기위해 Persitence 장치가 필요로합니다. 

StateFul이 왜 필요한가?

위 비교를 보면 StateLess가 장점이 많은 개발방식으로 보이지만, 그 차이를 이해하고 적합한 방식을 사용해야합니다. 

대규모 서비스에서는 수많은 의미있는 메시지가 실시간으로 오고가며 중요한정보를 누적시켜서 일시적으로 보관하고

사용해야 필요가 있습니다. 이것을 모두 DB에 업데이트하고 조회하려면 병목지점이 생기게마련입니다. 


AKKA의 관점에서 본다고하면, 우리가 설계한 액터는 특정사용자의 요청/응답보다 더 오랜시간 존재할수 있으며 시간이 지남에따라

중요한 정보가 누적될수가 있습니다. DB를 통하지 않고 수천개의 실시간 메시지를 처리하면서 성능에 영향을 끼치지 않는 타이밍에

누적된 내용을 DB에 저장도 할수가 있습니다.

AKKA에서는 실시간 액터메시지를 통해 영속성을 실현하기위해  이벤트소싱/스냅샷 등의 장치를 제공해줍니다.





  • No labels