AkkaDotModule.Webnori

Package Description


Keywords
Install
Install-Package AkkaDotModule.Webnori -Version 1.1.2

Documentation

AkkaDotModule

์ €์žฅ์†Œ : https://github.com/psmon/AkkaDotModule

ํ”„๋กœ์ ํŠธ๋ช… : ์•„์นด๋‹ท๋ชจ๋“ˆ

๋‹ท๋„ท ํ™˜๊ฒฝ์—์„œ AKKA(https://getakka.net/)์˜ ๋ชจ๋“ˆ์„ ์•ˆ์ •์ ์œผ๋กœ ๊ณตํ†ตํ™”ํ•˜๊ณ  AKKA.NET์„ ํ•™์Šตํ• ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜์—ฌ

๋‹ท๋„ท์ฝ”์–ด์—์„œ ์œ ์šฉํ•œ ๋ฉ”์‹œ์ง€ ํ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹ฌํ”Œํ•˜๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

๋ฒ„์ „์—…์ด ๋ ๋•Œ๋งˆ๋‹ค ์œ ์šฉํ•œ ์ปค์Šคํ…€ ์•กํ„ฐ๋ชจ๋ธ์„ ์ œ๊ณต๋ฐ ์„ค๋ช…ํ•˜๋ฉฐ, ์•กํ„ฐ์™€ API์—์„œ ์‚ฌ์šฉ ์ƒ˜ํ”Œ์„ ๋™์‹œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

AKKA์˜ ๋ฒ„์ „์—…์— ํ•ญ์ƒ ๋Œ€์‘ํ•˜๋Š”๊ฒƒ์ด์•„๋‹Œ, ์œ ๋‹›ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์•ˆ์ •์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€์ฒ˜๋ฆฌ๊ธฐ๋Šฅ์„

์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

AppLayOut

  • AkkaDotBootApi : ๋‹ท๋„ท์ฝ”์–ด API์—์„œ AKKA๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ƒ˜ํ”Œ API์ž…๋‹ˆ๋‹ค.
  • AkkaBlazorApp : Blazor์—์„œ ์•กํ„ฐ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜๋Š” ์ƒ˜ํ”Œ ์›น์ž…๋‹ˆ๋‹ค.
  • AkkaDotModule : AKKA.NET ๋ชจ๋“ˆ์ด ํŒจํ‚ค์ง•๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ท๋„ท์ฝ”์–ด๋ฅผ ์œ„ํ•ด ์œ ํ‹ธ๋ฆฌํ‹ฐํ™” ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  • TestAkkaModule : AkkaDotModule์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์œ„ํ•œ ์œ ๋‹›ํ…Œ์ŠคํŠธ
  • Doc : Akka๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์„œ๋“ค

์ง€์›๊ธฐ๋Šฅ

  • HelloActor : AKKA ์ž…๋ฌธ์‹œ ์ฒ˜์Œ๋ด์•ผํ•  ๊ธฐ๋ณธ ์•กํ„ฐ ๋‹ค๋ฃจ๊ธฐ (๋ฉ”์‹œ์ง€ํ๋ฅผ ๋‚ด์žฅํ•˜๊ธฐ)
  • ThrottleWork : ์ŠคํŠธ๋ฆผ์˜ ์†๋„ ์ œ์–ด๊ฐ€ ํ•„์š”ํ• ๋•Œ ๋ฐธ๋ธŒ์˜ ์ž ๊ธˆ๊ธฐ๋Šฅ์„ ํ™œ์šฉ
  • PriorityMessageMailbox : ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์‹œ์ง€์˜ ์šฐ์„ ์ˆœ์œ„ ์กฐ์ ˆ์ด ํ•„์š”ํ•œ๊ฒฝ์šฐ
  • ConsumerSystem : Kafka์˜ Consumer๋ฅผ ์‹ฌํ”Œํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ
  • ProducerSystem : Kafka์˜ Producer๋ฅผ ์‹ฌํ”Œํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ

More Detail

์ฃผ์š” ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

  • 1.1.1 : Signalr Stream ์ง€์› - http://wiki.webnori.com/display/webfr/SignalR+with+AKKA+Stream
  • 1.1.0 : Blazor With AKKA - http://wiki.webnori.com/display/webfr/Blazor+With+AKKA
  • 1.0.9 : Kafka ConsumerActor ์ถ”๊ฐ€ (๋ชฉ์ :Kafka SSL๋ชจ๋“œ์ง€์›) - ์‚ฌ์šฉ๋ฒ•
  • 1.0.8 : Kafka ProducerActor ์ถ”๊ฐ€ (๋ชฉ์ :Kafka SSL๋ชจ๋“œ์ง€์›) - Link
  • 1.0.7 : ์‹ค์‹œ๊ฐ„ ๋ฐฐ์น˜์ฒ˜๋ฆฌ๊ธฐ(BatchActor) ์ถ”๊ฐ€
  • 1.0.6 : Kafka ๋„์ปค ์ธํ”„๋ผ์ถ”๊ฐ€๋ฐ, TestAPI ์ƒ˜ํ”Œ ์ถ”๊ฐ€
  • 1.0.5 : Kafka Stream ์ง€์› : ์•กํ„ฐ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜์—ฌ Kafka๋ฅผ ๋” ์‹ฌํ”Œํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • 1.0.4 : AKKA 1.4.7 ๋ฒ„์ „์‚ฌ์šฉ
  • 1.0.3 : ๋ฉ”์‹œ์ง€ ์šฐ์„ ์ˆœ์œ„(PriorityMessageMailbox) ์ฒ˜๋ฆฌ๊ธฐ ์ถ”๊ฐ€
  • 1.0.1 : ๊ธฐ๋ณธ ์•กํ„ฐ(TestActors) ์‚ฌ์šฉ๋ฒ•์ถ”๊ฐ€
  • 1.0.0 : Nuget์—์„œ AkkaDotModule.Webnori ๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜๊ฐ€๋Šฅ - ๊ณต์‹ Oepn
  • 0.0.9 : DotNetAPP์—์„œ AkkaDotModule์„ ์‰ฝ๊ฒŒ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ AkkaLoad ๋ฅผ ์ถ”๊ฐ€
  • 0.0.8 : ์กฐ์ ˆ๊ธฐ(ThrottleWork) ์ถ”๊ฐ€, ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€๋Ÿ‰์ธ์ž…ํ•˜๊ณ  ์กฐ์ ˆ๊ธฐ์—์„œ ์•ˆ์ „ํ•œ ์†๋„์ œ์–ด๊ฐ€ ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉ

Nuget ๊ฒฝ๋กœ

Link : https://www.nuget.org/packages/AkkaDotModule.Webnori/

dotnet add package AkkaDotModule.Webnori --version x.x.x

๋‹ท๋„ท์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํƒ‘์žฌ

akka.conf / akka.kafka.conf ์ถ”๊ฐ€

์ž์„ธํ•œ ์˜ต์…˜์„ค์ •์€ ํ”„๋กœ์ ํŠธ๋‚ด conf ์ฐธ๊ณ 

//akka.conf
akka {
    loggers = ["Akka.Logger.NLog.NLogLogger, Akka.Logger.NLog"]
    loglevel = debug
}

//akka.kafka.conf
akka.kafka.committer { 
  max-batch = 1000  
  max-interval = 10s  
  parallelism = 100
  delivery = WaitForAck
}

Startup.cs ์ˆ˜์ •

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // Akka ์…‹ํŒ…
    var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    var akkaConfig = AkkaLoad.Load(envName, Configuration);
    actorSystem = ActorSystem.Create("AkkaDotBootSystem", akkaConfig);            
    services.AddAkka(actorSystem);
...................
}    
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApplicationLifetime lifetime)
{
    lifetime.ApplicationStarted.Register(() =>
    {
        // ๋ฐธ๋ธŒ Work : ์ดˆ๋‹น ์ž‘์—…๋Ÿ‰์„ ์กฐ์ ˆ                
        int timeSec = 1;
        int elemntPerSec = 5;
        var throttleWork = AkkaLoad.RegisterActor("throttleWork", 
            actorSystem.ActorOf(Props.Create(() => new ThrottleWork(elemntPerSec, timeSec)), "throttleWork"));

        // ์‹ค์ œ Work : ๋ฐธ๋ธŒ์— ๋ฐฉ์ถœ๋˜๋Š” Task๋ฅผ ๊ฐœ๋ณ„๋กœ ์ฒ˜๋ฆฌ
        var worker = AkkaLoad.RegisterActor("worker", actorSystem.ActorOf(Props.Create<WorkActor>(), "worker"));
        // ๋ฐฐ๋ธŒ์˜ ์ž‘์—…์ž๋ฅผ ์ง€์ •
        throttleWork.Tell(new SetTarget(worker));
    });
}

์‚ฌ์šฉ

// DI๋ฅผ ์ง€์›ํ• ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ์œ ๋‹ˆํฌํ•œ ๋„ค์ด๋ฐ์œผ๋กœ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•œ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์•กํ„ฐ๋ฅผ ์„ ํƒํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
IActorRef throttleWork = AkkaLoad.ActorSelect("throttleWork");
var batchList = new BatchList(batchDatas.ToImmutableList());
throttleWork.Tell(batchList);

// ACTOR ๊ตฌ์„ฑ์€ TopLevel Architeture๋กœ DI์™€ ์–ด์šธ๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ, ์‚ฌ์‹ค์ƒ ํ•„์š”์—†์Šต๋‹ˆ๋‹ค.
//DI์—ฐ๋™์‹œ ๋‹ค์Œ์„ ์ฐธ๊ณ  DI๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ , ๋” ์ด์ ์ด ์žˆ์„๋•Œ ์‚ฌ์šฉํ• ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.     
์ฐธ๊ณ  url : https://getakka.net/articles/actors/di-core.html

์ถ”๊ฐ€ ์ฐธ๊ณ ์ž๋ฃŒ

๊ธฐ์ˆ ์ง€์›

์ด ๋ชจ๋“ˆ ์‚ฌ์šฉ์„ ํฌํ•จ akka์— ๋Œ€ํ•œ ๊ธฐ์ˆ ๋ฌธ์˜ ์–ธ์ œ๋“  ํ™˜์˜์ž…๋‹ˆ๋‹ค.

Akka FaceBook Link : https://www.facebook.com/groups/akkalabs

Emal : psmon@live.co.kr