AkkaSystem 사용은 다양한 방식으로 실행화 할수 있습니다.

Akka.net  설치



akka 설치
PM> install-package Akka
PM> install-package Akka.Remote


Console 실행 시나리오



using Akka;
using Akka.Actor;
using Akka.Configuration;

namespace Foo.Bar
{
    class Program
    {
        static void Main(string[] args)
        {
            //configure remoting for localhost:8081
            var fluentConfig = FluentConfig.Begin()
                .StartRemotingOn("localhost", 8081)
                .Build();

            using (var system = ActorSystem.Create("my-actor-server", fluentConfig))
            {
                //start two services
                var service1= system.ActorOf<Service1>("service1");
                var service2 = system.ActorOf<Service2>("service2");
                Console.ReadKey();
            }
        }
    }
}

ASP.NET


ASP.NET ( IIS 내부실행 전략 )



public class MvcApplication : System.Web.HttpApplication
{
    protected static ActorSystem ActorSystem;
    //here you would store your toplevel actor-refs
    protected static IActorRef MyActor;

    protected void Application_Start()
    {
        //your mvc config. Does not really matter if you initialise
        //your actor system before or after

        ActorSystem = ActorSystem.Create("app");
        //here you would register your toplevel actors
        MyActor = ActorSystem.ActorOf<MyActor>();
    }
}

Interaction between Controllers and Akka.NET  ( 특정 API에 Actor의 기능 수행을 연결한 케이스 )



public class SomeController  : ApiController
{
      //expose your endpoint as async
      public async Task<SomeResult> Post(SomeRequest someRequest)
      {
           //send a message based on your incoming arguments to one of the actors you created earlier
           //and await the result by sending the message to `Ask`
           var result = await MvcApplication.MyActor.Ask<SomeResult>(new SomeMessage(someRequest.SomeArg1,someRequest.SomeArg2));
           return result;
      }
}

WindowsService ( Topshelf를 이용한 윈도우 서비스화)



http://topshelf-project.com/

topshelf 는 개발서비스를 단독 서비스 실행 하는데 도움이되는 툴킷입니다. ( 마이크로 서비스화에 도움이되는 부분요소)


using Akka.Actor;
using Topshelf;


class Program
{
    static void Main(string[] args)
    {
        HostFactory.Run(x =>
        {
            x.Service<MyActorService>(s =>
            {
                s.ConstructUsing(n => new MyActorService());
                s.WhenStarted(service => service.Start());
                s.WhenStopped(service => service.Stop());
                //continue and restart directives are also available
            });

            x.RunAsLocalSystem();
            x.UseAssemblyInfoForServiceInfo();
        });
    }
}

/// <summary>
/// This class acts as an interface between your application and TopShelf
/// </summary>
public class MyActorService
{
    private ActorSystem mySystem;

    public void Start()
    {
        //this is where you setup your actor system and other things
        mySystem = ActorSystem.Create("MySystem");
    }

    public async void Stop()
    {
        //this is where you stop your actor system
        await mySystem.Terminate();
    }
}


Azure PaaS Worker Role  ( MS-Azure 클라우드 환경에서의 실행연동 )



namespace MyActorWorkerRole
{
    public class WorkerRole : RoleEntryPoint
    {
        private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
        private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false);

        private ActorSystem _actorSystem;

        public override bool OnStart()
        {
            // Setup the Actor System
            _actorSystem = ActorSystem.Create("MySystem");

            return (base.OnStart());
        }

        public override void OnStop()
        {
            this.cancellationTokenSource.Cancel();
            this.runCompleteEvent.WaitOne();

            // Shutdown the Actor System
            _actorSystem.Shutdown();

            base.OnStop();
        }

        public override void Run()
        {
            try
            {
                this.RunAsync(this.cancellationTokenSource.Token).Wait();
            }
            finally
            {
                this.runCompleteEvent.Set();
            }
        }

        private async Task RunAsync(CancellationToken cancellationToken)
        {
            // Create an instance to the top-level user Actor
            var workerRoleActor = _actorSystem.ActorOf<WorkerRoleActor>("WorkerRole");

            // Send a message to the Actor
            workerRoleActor.Tell(new WorkerRoleMessage("Hello World!"));

            while (!cancellationToken.IsCancellationRequested)
            {
                await Task.Delay(1000);
            }
        }
    }
}


Docker with .net CORE

개발환경에서 Docker 활용이 점점 중요화되고 있습니다.

최근 IDE툴들은 가상머신과 연동이 되어, 도커를 지원하고 있습니다.

도커로 구성된 컨테이너는 클라우드환경과 다양한 방법으로 배포가 가능해집니다.

참고 URL : .NET Core API for ORM(Entity)







  • No labels
Write a comment…