개요
클러스터 기능으로 유연하게 Job을 노드단위로 늘어난다고 했을때, 각 노드에서 발생하는
이벤트를 건바이건으로 RDB 적재하는것은 비효율적입니다.
아카의 클러스터 메시징은 병목없이 TPS를 늘려갈수 있으나, 단일 Db는 그렇지 못합니다.
짧은 시간에 생긴 이벤트에 대해 N개의 인서트 쿼리를 작동시키는것이아닌 단일 인스턴스에게
이벤트 적재를 위임함으로 효율적으로 적재할수 있으며, 3가지 기술을 활용하여
이문제를 해결할수 있습니다.
- 클러스터 싱글톤 액터 : 클러스터내에 단 하나만 작동가능 ( 해당 롤을가진 노드가 다운되면, 다른 노드에게 자동 위임합니다.)
- FSM Actor : 실시간 메시지에대한 상태머신컨셉을 적용할수 있으며. 특정 초만큼 메시징을 모아 컬렉션 처리가 가능합니다.
- 벌크 Insert : 대량 업데이트시 사용되며, 천건 건바이건으로 인서트 하는것보다. 십만건 벌크처리를 하는것이 훨씬 시간이 적게 소요됩니다.
싱글톤 액터 구현
using System; using System.Collections.Generic; using Akka.Actor; namespace AkkaNetCore.Actors { public class SingleToneActor : ReceiveActor { private readonly ILoggingAdapter logger = Context.GetLogger(); private readonly string id; private IActorRef BatchWriter_Rev; private IActorRef BatchManager_Rev; public SingleToneActor() { BatchWriter_Rev = Context.ActorOf<BatchWriterActor>(); BatchManager_Rev = Context.ActorOf(Props.Create(() => new BatchActor(10))); BatchManager_Rev.Tell(new SetTarget(BatchWriter_Rev)); id = Guid.NewGuid().ToString(); logger.Info($"싱글톤 액터 생성:{id}"); startTime = DateTime.Now; totalCount = 0; ReceiveAsync<DelayMsg>(async msg => { BatchManager_Rev.Tell(new Queue(msg)); }); } } } //싱글톤 클러스터 액터작동 var actor = AkkaBoostrap.BootstrapSingleton<SingleToneActor>(actorSystem, "SingleToneActor", "akkanet"); SingleToneActor = AkkaBoostrap.BootstrapSingletonProxy(actorSystem, "SingleToneActor", "akkanet", "/user/SingleToneActor", "singleToneActorProxy"); git : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Extensions/AkkaBoostrap.cs