Actor메시지는 일반적으로 전송시 순서가 보장이 되지만
MailBox의 경우 동시에 보낸 메시지중 우선으로 처리해야할 메시지에대해
정의가 가능합니다.
우선순위 정의 코드
Issue라는 메시지에 IsSecurityFlaw 참인 조건을 우선처리
using Akka.Actor; using Akka.Event; using Akka.Dispatch; //namespace ServiceA.STUDY public class Issue { public bool IsSecurityFlaw; public bool IsBug; public string Message; public Issue(string message, bool isBug) { Message = message; IsBug = isBug; IsSecurityFlaw = !isBug; } } public class IssueTrackerMailbox : UnboundedPriorityMailbox { public IssueTrackerMailbox(Settings setting , Akka.Configuration.Config config) : base(setting, config) { } protected override int PriorityGenerator(object message) { var issue = message as Issue; if (issue != null) { if (issue.IsSecurityFlaw) return 0; if (issue.IsBug) return 1; } return 2; } }
PriorityGenerator 에서 우선순위를 조정합니다.
Actor 설계
public class MailBoxActor : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public MailBoxActor() { Receive<Issue>(issue => { log.Info("IssueInfo : Message:{0} IsSecurityFlaw:{1} IsBug:{2} ", issue.Message, issue.IsSecurityFlaw, issue.IsBug); }); } }
정의코드를 사용하기위한 설정
#특정한 액터에 MailBox 메시지 처리기를 사용하겠다고 설정을 합니다. my-custom-mailbox { mailbox-type : "ServiceA.STUDY.IssueTrackerMailbox, ServiceA" } actor.deployment { /mymailbox { mailbox = my-custom-mailbox } }
실행코드
var mailboxOpt = Props.Create<MailBoxActor>().WithMailbox("my-custom-mailbox"); var actor = actorSystem.ActorOf(mailboxOpt, "mymailbox"); Issue msg1 = new Issue("test1",true); Issue msg2 = new Issue("test2", false); Issue msg3 = new Issue("test3", true); Issue msg4 = new Issue("test4", true); Issue msg5 = new Issue("test5", false); actor.Tell(msg1); actor.Tell(msg2); actor.Tell(msg3); actor.Tell(msg4); actor.Tell(msg5);
다양한 이슈를 썩어서 동시에 보냈지만, IsSecurityFlaw=true 인 메시지를 우선 처리하게 됩니다.
동시성 처리에 있어서 가급적 우선이란 의미가 맞을듯 하며 , 어느 외부적요인 혹은 동시성이 달라서
메시지 순서가 변경된다고 해도, 서비스에 이상이생기는 설계는 하지 말아야 할것입니다.