At-Least-Once Delivery - 적어도 메시지를 한번 보내려는 메카니즘으로 PersistenceActor와 결합하여
목표를 달성할수 있습니다. 적어도 한번보내려는 메카니즘으로 인해 중복 메시지 발생에 유의하여 작성
해보겠습니다.
메시지설계
public class Msg { public Msg(long deliveryId, string message) { DeliveryId = deliveryId; Message = message; } public long DeliveryId { get; } public string Message { get; } } public class Confirm { public Confirm(long deliveryId) { DeliveryId = deliveryId; } public long DeliveryId { get; } } public interface IEvent { } public class MsgSent : IEvent { public MsgSent(string message) { Message = message; } public string Message { get; } } public class MsgConfirmed : IEvent { public MsgConfirmed(long deliveryId) { DeliveryId = deliveryId; } public long DeliveryId { get; } }
액터설계
public class ExampleAtLeastOnceDeliveryReceiveActor : AtLeastOnceDeliveryReceiveActor { private readonly IActorRef _destionationActor = Context.ActorOf<ExampleDestinationAtLeastOnceDeliveryReceiveActor>(); public ExampleAtLeastOnceDeliveryReceiveActor() { Recover<MsgSent>(msgSent => Handler(msgSent)); Recover<MsgConfirmed>(msgConfirmed => Handler(msgConfirmed)); Command<string>(str => { Persist(new MsgSent(str), Handler); }); Command<Confirm>(confirm => { Persist(new MsgConfirmed(confirm.DeliveryId), Handler); }); } private void Handler(MsgSent msgSent) { Deliver(_destionationActor.Path, l => new Msg(l, msgSent.Message)); } private void Handler(MsgConfirmed msgConfirmed) { ConfirmDelivery(msgConfirmed.DeliveryId); } public override string PersistenceId { get; } = "persistence-id"; }