Page History
...
이벤트 소싱예제 ( 모든 커멘드를 기록하는 액터)
먼저 전체 소스를 언급하고, 설계된 요소하나하나를 분석해보 겠습니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
using System.Collections.Immutable; using Akka.Persistence; #region MessageData public class Shutdown { } public class Cmd { public Cmd(string data) { Data = data; } public string Data { get; } } public class Evt { public Evt(string data) { Data = data; } public string Data { get; } } public class ExampleState { private readonly ImmutableList<string> _events; public ExampleState(ImmutableList<string> events) { _events = events; } public ExampleState() : this(ImmutableList.Create<string>()) { } public ExampleState Updated(Evt evt) { return new ExampleState(_events.Add(evt.Data)); } public int Size => _events.Count; public override string ToString() { return string.Join(", ", _events.Reverse()); } } #endregion #region Actor public class PersistentActor : UntypedPersistentActor { private ExampleState _state = new ExampleState(); private void UpdateState(Evt evt) { _state = _state.Updated(evt); } private int NumEvents => _state.Size; protected override void OnRecover(object message) { switch (message) { case Evt evt: UpdateState(evt); break; case SnapshotOffer snapshot when snapshot.Snapshot is ExampleState: _state = (ExampleState)snapshot.Snapshot; break; } } protected override void OnCommand(object message) { switch (message) { case Cmd cmd: Persist(new Evt($"{cmd.Data}-{NumEvents}"), UpdateState); Persist(new Evt($"{cmd.Data}-{NumEvents + 1}"), evt => { UpdateState(evt); Context.System.EventStream.Publish(evt); }); break; case "snap": SaveSnapshot(_state); break; case "print": Console.WriteLine("Try print"); Console.WriteLine(_state); break; case Shutdown down: Context.Stop(Self); break; } } public override string PersistenceId { get; } = "sample-id-1"; } public class MyPersistentActor : UntypedPersistentActor { public override string PersistenceId => "my-stable-persistence-id"; protected override void OnRecover(object message) { // handle recovery here } protected override void OnCommand(object message) { if (message is string c) { Sender.Tell(c); Persist($"evt-{c}-1", e => Sender.Tell(e)); Persist($"evt-{c}-2", e => Sender.Tell(e)); DeferAsync($"evt-{c}-3", e => Sender.Tell(e)); } } } #endregion |
...