클러스터를 테스트 하기위해서는, 기본적으로 원격으로 구동하여 각 서비스포트를 멤버쉽화하여야합니다.

물론 실제 로컬 테스트 환경구축을 위해, VisualStudio에서는 도커-HyperV 연동을통해 가상 컴퓨터에 디버깅도가능하며

가상 네트워크구축을 통해 실제와 유사한 클러스터 환경을 구축할수도 있습니다.

이러한게 있고 실제로도 사용가능하지만 우리는,  어플리케이션 하나에 옵션을 주면 여러가지 포트및 롤변경을하는

방식으로 학습환경을 구축하도록 하겠습니다.


테스트 콘솔 컨셉

1.RemoteAccessTest
2.클러스터-시드노드생성(고정포트-9999)
3.클러스터-조인노드생성(랜던포트)
4.클러스터-예비
5.클러스터-예비

테스트 선택?

예를들면, 우리의 테스트 어플리케이션이 실행이되면 위와같이  , 작동방식을 물어볼것이며

우리가 작성한 어플리케이션은 옵션에따라 완전 다른 롤을가진 클러스터를 실행할것입니다.


더 진보된 테스트 방식인 MultiNodeTestRunner가 준비되어있지만 

https://github.com/akkadotnet/akka.net/tree/dev/src/core/Akka.MultiNodeTestRunner

다소 고전적인 방법으로  클러스터를 구성하고 그것이 잘 작동되는지 확인해보겠습니다.


런타임시 AKKA구동 환경 적용

var config = ConfigurationFactory.ParseString(@" akka.remote.dot-netty.tcp 
{ transport-class = ""Akka.Remote.Transport.DotNetty.DotNettyTransport, 
Akka.Remote"" transport-protocol = tcp port = 8091 hostname = ""127.0.0.1"" }"
);

var system = ActorSystem.Create("MyActorSystem", config);

//이 방식을 사용하여, 하나의 어플리케이션에 다양한 포트를 리슨하는
//액터시스템을 다수개 만들수 있습니다. 원칙적인 롤은 어플리케이션 하나당
//하나의 액터 시스템만 가지는것입니다.

Akka의 설정은 앞장에서 했듯이 , .net의 일반적인 환경설정 app.config에서 가능하며 호환이 됩니다.

하지만 우리는 어플리케이션 하나에 작동방식을 런타임으로 바꿔가며 테스트를 할것이기 때문에

클러스터에 한해서 위와같은 설정법을 사용할것입니다.


테스트 어플리케이션 코드

using System;
using Akka.Actor;
using System.Threading.Tasks;
using ServiceB.STUDY;

namespace ServiceB
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleKeyInfo cki;
            Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler);
            Task.Delay(1000).Wait();
            Console.WriteLine("테스트 선택");
            Console.WriteLine("1.RemoteAccessTest");
            Console.WriteLine("2.클러스터-시드노드생성(고정포트)");
            Console.WriteLine("3.클러스터-조인노드생성(랜던포트");
            Console.WriteLine("4.클러스터-예비");
            Console.WriteLine("5.클러스터-예비");
            cki = Console.ReadKey(true);

            AkkaTest akkaTest = new AkkaTest();

            switch (cki.Key)
            {
                case ConsoleKey.D1:
                    akkaTest.remoteTest();
                    break;
                case ConsoleKey.D2:
                    break;
                case ConsoleKey.D3:
                    break;
                case ConsoleKey.D4:
                    break;
                case ConsoleKey.D5:
                    break;
            }

            while (true)
            {
                // 메인 어플리케이션 종료방지를 위한코드 ( ctrl+x 종료 )
                cki = Console.ReadKey(true);
                if (cki.Key == ConsoleKey.X) break;
            }
        }

        protected static void myHandler(object sender, ConsoleCancelEventArgs args)
        {
            args.Cancel = true;
        }
    }
}

//요건 다른 파일에 분리
namespace ServiceB.STUDY
{
    public class AkkaTest
    {
        ActorSystem actorSystem;
        public void remoteTest()
        {
            actorSystem = ActorSystem.Create("ServiceB");
            ActorSelection otherActor = actorSystem.ActorSelection("akka.tcp://ServiceA@127.0.0.1:8001/user/myactor");
            Hello msg = new Hello("hello");
            object result = otherActor.Ask(msg).Result;
            Console.WriteLine("GetMessage:" + result.ToString());
        }
    }
}


단순하게 테스트 코드를 집결 시킬것입니다.






  • No labels