스케쥴러에의해 특정 액터용 메시지가 반복발생 시킬수 있는

트리거 장치를 알아보겠습니다.

기본 액터 스케줄러

                    ActorSystem
                   .Scheduler
                   .ScheduleTellRepeatedly(
                        TimeSpan.FromMinutes(30),   //30분뒤 부터 작동게시
                        TimeSpan.FromHours(12),     //12시마다 Full 인덱싱
                        indexActor, new ActorCmd()
                        {
                            CmdType = ActorCmdType.FullIndexing
                        }, ActorRefs.NoSender
                    );

참고 URL : https://getakka.net/articles/utilities/scheduler.html

기본 액터 스케줄러입니다. 단순하게 짧은주기 반복으로 사용하기엔 무리가 없지만

Cron과같이 조금더 디테일하고 , 복잡하고 롱텀주기의 스케쥴 주기를  관리하기에  부족해보입니다.

Quartz.NET 소개

JAVA진영의 Spring Boot Schedule에 대응하는 닷넷용 스케쥴러입니다.

Persitence,Cluster등이 지원되며

Quartz만으로 스케쥴에 해당하는 트리거를 발생시키고 활용하기에 부족함 없어보입니다.

링크:https://www.quartz-scheduler.net/documentation/


Quartz.Actor

Akka.Quartz.Actor 모듈은 Quartz.net의 스케쥴기능을 활용해 , 액터에 특정 스케줄마다 메시지를 발송할수 있게하는 모듈입니다.

Quartz의 트리거기능을 활용하면서 , Job은 액터에게 메시지 보내 실행됩니다.(이벤트 드리븐)

스케줄러 + 액터패턴으로 잡을 관리할시 유용할수 있습니다.

QuartzActor샘플

스케줄러액터(quartzActor) 에 지정된 잡에의해 , 주기적으로 작업자(Receiver)에게 메시지 전송이 가능합니다.

PM>Install-Package Akka.Quartz.Actor

class Receiver: ActorBase
{
    public Receiver()
    {
    }

    protected override bool Receive(object message)
    {
    	//handle scheduled message here
    }
 }
var receiver = Sys.ActorOf(Props.Create(() => new Receiver()), "Receiver");

var quartzActor = Sys.ActorOf(Props.Create(() => new QuartzActor()), "QuartzActor");

quartzActor.Tell(new CreateJob(receiver, "Hello", TriggerBuilder.Create().WithCronSchedule( " * * * * * ?").Build())));

스케줄러를 액터와 연동할때 이점

  • 비동기적으로 명령이 전송되기 때문에, 작업 스케쥴러 명령실행을 보장합니다.
  • 하나의 액터는 순차적으로 처리되기 때문에 , 배치잡이 중복으로 실행되지 않습니다.
  • 복수개의 동시 잡이 필요하거나, 리모트로 작동이 필요할시 라우터액터 혹은 리모트액터로 명령 전송을 할수 있습니다. ( 코드변경없이 대상 액터변경)


지연시작이 필요할때

업데이트로 인해 어플리케이션이 첫 구동되는동안은 많은 준비를 하고 있으며 , 준비되지 않은 상태에서 스케쥴이 돌게되면

실패날 확률이 있을수 있습니다. 이경우 트리거 명령을 최초 넣는거 자체를  StartAt을 통해 지연시킬수 있습니다.

quartzActor.Tell(new CreateJob(indexActor, cmdUpdate_Index, TriggerBuilder.Create()
    .StartAt(new DateTimeOffset(DateTime.Now).AddMinutes(1))
    .WithCronSchedule(" * * * * * ?").Build()));



링크: https://github.com/akkadotnet/Akka.Quartz.Actor




  • No labels