Page History
Info |
---|
At-Least-Once Delivery - 적어도 메시지를 한번 보내려는 메카니즘으로 PersistenceActor와 결합하여 목표를 달성할수 있습니다. 적어도 한번보내려는 메카니즘으로 인해 중복 메시지 발생에 유의하여 작성 해보겠습니다. |
메시지설계
Code Block | ||||
---|---|---|---|---|
| ||||
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; }
}
|
액터설계
Code Block | ||||
---|---|---|---|---|
| ||||
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";
} |