Persitence의 경우 액터의 상태를 메모리에 지속 또는 영속적으로 보존하여 다양한 성능및 분산전략에 사용이됩니다. 유사한 목적인 Redius의 경우도 메모리 데이터의 영속성을 보장하지만 KeyBase로 복잡한 분산전략에 단순한 대응만을 하기때문에 한계가 있으며 Actor의 Persitence는 FSM(유한상태머신)까지 활용가능하며, 다양한 전략에서 대응을 할수가 있습니다. Persitence를 사용하기위해 몇가지 PersitenceActor가 제공 되어지며 , 영속적인 저장용도로 저널에관한 Pulgin 지정을 할수가 있습니다. |
메모리 데이터는 왜 상태를 복구해야할까? 메모리 데이터에 영속성을 부여할수 있다고 해서 모든 메모리데이터를 영속성을 만드는것은 합리적이지 못합니다. 예를 들어 HTTP요청의 수신만으로 모든상태를 복구할수있다고 하면 , 실패할때 다시 요청하면 되기 때문입니다. 이것에 대한 대부분의 처리는 DB가 해왔을것입니다. 그러면 액터의 상태복구가 필요할때는 언제인가? 액터는 메시지하나(요청/응답) 보다 더 오래존재하며, 시간이 지남에따라 다양한 가치있는 정보가 누적이됩니다. 또한 액터는 각각을 식별할수 있는 정체성이 있으며 해당 액터를 설계된 조건에의해 생성및 접근을 할수가 있습니다. 온라인 쇼핑몰 장바구니 액터를 예를 들어봅시다. 상품을 검색하고 장바구니에 상품을 빼고 넣고 , 해당 시스템이 의도된 업데이트이던지 장애에의해서이던지, 우리는 빈장바구니를 보여주고 싶지 않을것입니다. 그리고 그것은 사용자가 다른기기로 옮겨가게 될시도 장바구니는 유지될것입니다. 이것은 DB의 의존없이 액터의 상태를 영속화해야 할 필요성을 보여주는 부분적인 예일뿐입니다. 위와 같은 처리를, 우리의 메인 DB에 모든 사용자의 이벤트를 기록하여 복구하는 방법을 사용 해도됩니다. 그것이 전통적으로 익숙한 개발 방법이며, DB를 차츰 느리게 하는 방법이 였을것입니다. |
akka.persistence 를 설치하여, Actor 영속성에 관련된 기능을 제공 받습니다.

Class에대해 조금 고급화된 패턴 매칭을 사용하기위해 ( VS-2015사용중이라면)
C# 7.0 에서 추가된 패턴매칭을 사용하겠습니다. ( if,switch 를 좀더 유연하게 클래스와 매칭하여 사용)
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));
}
|
컴파일러 프로젝트내에서 업그레이드 : Install-Package Microsoft.Net.Compilers -Version 2.3.1
link: https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching
닷넷 버젼 4.5.2 과 Compiler Version 2.3.1 조합이 코드 인텔리젼과 빌드에서 문제가 없습니다. ( vs 2015기준)
이것은 Scala에서 먼저 도입된것인데 ( 그이전 누가 먼저도입했는지는 모름)
다른언어에서의 패턴매칭도 참고하시면 도움이 될듯합니다.
link : https://docs.scala-lang.org/tour/pattern-matching.html
개인생각 - 보통 문법이 어느 한가지 랭기지에서만 지원되면 (ex>MS-LINQ와 같은것) 일반적으로 사용하려고 하지 않습니다.
Why? 다른 언어에 해당하는 스펙이 없으면 변환이 어려우며, 다른 언어를 사용하는 개발자와 해당 문법의 장점을
이야기할순 있겠지만 LINQ로 작성된 코드를 가지고 공통적인 이야기를 할수가 없습니다. 해당 플래폼에 고립될수가 있습니다.
패턴매칭을 3년전 스칼라에서 처음보았을때 제가 사용하는 언어 안에서는 그러한 컨셉이 없어서 눈여겨 못보았지만,
이제는 if문을 줄이기위해 대부분의 언어에서 직접혹은 간접적으로 지원하는 컨셉인듯합니다. LINQ도 언어의 공통적인 스펙이
될지는 조금더 살펴보아야 할듯 보입니다.