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๋ฅผ ์ฌํํ๊ณ ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉ
์ฃผ์ ๋ฆด๋ฆฌ์ฆ ๋ ธํธ
- 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
์ถ๊ฐ ์ฐธ๊ณ ์๋ฃ
- https://getakka.net/ : Akka.net Origin - ๋ณธ ์ ์ฅ์๋ Akka.net(ํ๊ธ)์ ๋ฌธ์ ๋์์ฃผ๋ฉฐ AKKA์ ๊ณ ๊ธ ํ์ต์ ์๋ฌธ์ฌ์ดํธ์์ ํ๋๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- http://wiki.webnori.com/display/AKKA : AKKA์ ์ ๋ฐ์ ์ธ ์ปจ์ (JAVAํฌํจ)
- http://wiki.webnori.com/display/webfr/.NET+Core+With+Akka : NetCoreAPI์์ ํ์ฉ (NET core ์ ์ฉ)
- http://wiki.webnori.com/display/webfr/Kafka+with+Stream : Kafka ํ์ฉํ๊ธฐ
- https://getakka.net/articles/intro/tutorial-1.html : Top๋ ๋ฒจ ์ํคํ ์ณ : ์กํฐ์ ๊ทผ์ DI๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์ถฉ๋ถํฉ๋๋ค.
- https://github.com/Azure/azure-event-hubs-for-kafka : Azure EventHub์ Kafka์ฐ๊ฒฐํ๊ธฐ
- https://github.com/confluentinc/confluent-kafka-dotnet : ๋ท๋ท ์ฝ์ด๋ก Kafka์ฐ๊ฒฐํ๊ธฐ
๊ธฐ์ ์ง์
์ด ๋ชจ๋ ์ฌ์ฉ์ ํฌํจ akka์ ๋ํ ๊ธฐ์ ๋ฌธ์ ์ธ์ ๋ ํ์์ ๋๋ค.
Akka FaceBook Link : https://www.facebook.com/groups/akkalabs
Emal : psmon@live.co.kr