Persistense
Persitence의 경우 액터의 상태를 메모리에 지속 또는 영속적으로 보존하여 다양한 성능및 분산전략에 사용이됩니다.
유사한 목적인 Redius의 경우도 메모리 데이터의 영속성을 보장하지만 KeyBase로 복잡한 분산전략에 단순한 대응만을 하기때문에 한계가 있으며
Actor의 Persitence는 FSM(유한상태머신)까지 활용가능하며, 다양한 전략에서 대응을 할수가 있습니다.
Persitence를 사용하기위해 몇가지 PersitenceActor가 제공 되어지며 , 영속적인 저장용도로 저널에관한 Pulgin 지정을 할수가 있습니다.
언제사용할까
메모리 데이터는 왜 상태를 복구해야할까?
메모리 데이터에 영속성을 부여할수 있다고 해서 모든 메모리데이터를 영속성을 만드는것은 합리적이지 못합니다.
예를 들어 HTTP요청의 수신만으로 모든상태를 복구할수있다고 하면 , 실패할때 다시 요청하면 되기 때문입니다.
이것에 대한 대부분의 처리는 DB가 해왔기때문입니다.
그러면 액터의 상태복구가 필요할때는 언제인가?
액터는 메시지하나(요청/응답) 보다 더 오래존재하며, 시간이 지남에따라 다양한 가치있는 정보가 누적이됩니다.
또한 액터는 각각을 식별할수 있는 정체성이 있으며 해당 액터를 설계된 조건에의해 생성및 접근을 할수가 있습니다.
온라인 쇼핑몰 장바구니 액터를 예를 들어봅시다. 상품을 검색하고 장바구니에 상품을 빼고 넣고 , 해당 시스템이
의도된 업데이트이던지 장애에의해서이던지, 우리는 빈장바구니를 보여주고 싶지 않을것입니다. 그리고 그것은
사용자가 다른기기로 옮겨가게 될시도 장바구니는 유지될것입니다.
이것은 DB의 의존없이 액터의 상태를 영속화해야 할 필요성을 보여주는 부분적인 예일뿐입니다.
위와 같은 처리를, 우리의 메인 DB에 모든 사용자의 이벤트를 기록하여 복구하는 방법을 사용 해도됩니다.
그것이 전통적으로 익숙한 개발 방법이며, DB를 차츰 느리게 하는 방법이 였을것입니다.
Persitence는 실시간 메시지 처리는 다 해내면서, 원하는 타이밍에 스냅샷을 저장함으로 Write를 분리할수 있으며
저장소를 선택하여 중앙에 집중되는 부하를 분산 시킬수가 있습니다.
사용준비
akka.persistence 를 설치하여, Actor 영속성에 관련된 기능을 제공 받습니다.
c# 변경할수 없는 리스트
메시지 보증에 있어서, 변경할수 없는 ( 전송한 이후 중간에 누가 변경할수 없는) 제약조건은 중요합니다.
이것은 여러스레드가 접근을 하여도 값을 변경할수 없으니 , 스레드안정성을 보장할수 있으며
처음 발생한 메시지가 어떠한 동작에의해 변이 될수 없음을 뜻합니다.
akka.net 에서는 이러한 보증을 위해 .net 의 ImmutableList를 활용합니다.
link : https://msdn.microsoft.com/ko-kr/library/dn467185(v=vs.111).aspx
c# 7.0 패턴 매칭 사용
Class에대해 조금 고급화된 패턴 매칭을 사용하기위해 ( VS-2015사용중이라면)
C# 7.0 에서 추가된 패턴매칭을 사용하겠습니다. ( if,switch 를 좀더 유연하게 클래스와 매칭하여 사용)
아래 사용방식은 if문으로 늘려도 상관없습니다. -switch문을 단순하게 하는것은 Akka의 목표는 아니지만 메시지처리를 단순화하는것은 Akka의 목표에 포함이됩니다.
switch (message) { case Cmd cmd: break; case "snap": break; case "print": break; } switch (shape) { case Square s when s.Side == 0: case Circle c when c.Radius == 0: return 0; case Square s: return s.Side * s.Side; case Circle c: return c.Radius * c.Radius * Math.PI; default: throw new ArgumentException( message: "shape is not a recognized shape", paramName: nameof(shape)); }
컴파일러및 코드 분석기 프로젝트내에서 업그레이드
nuget install Microsoft.Net.Compilers # Install C# and VB compilers
nuget install Microsoft.CodeAnalysis # Install Language APIs and Services
참고 : https://github.com/dotnet/roslyn/tree/master
NetCompilers는 이전 Framework혹은 이전 VisualStudio에게 최신 C# 언어문법을 버젼을 제공합니다.
link: https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching
패턴매칭은 Scala에서 훨씬이전 도입된것인데
다른언어에서의 패턴매칭도 참고하시면 도움이 될듯합니다. .net의 패턴매칭은 상당수 이러한 컨셉을 가지고 왔습니다.
link : https://docs.scala-lang.org/tour/pattern-matching.html