根据 Akka.Net 文档,不推荐使用 PersistentView,而应使用 PersistenceQuery。在 ASP.Net Core 2.0 Web-API 应用程序中,我使用 Akka.Net 和事件源。我正在使用带有事件和快照的 SQL Server 插件来实现持久性。对于持久视图,我想开始使用 PersistenceQuery。当应用程序启动时,会回放事件以恢复参与者的状态。
我已经实现了一个日志阅读器,它正在接收事件,并使用它来组成一个视图。问题是,我怎样才能知道最后播放的事件已经到达,以便可以保存组合视图(作为一种快照)?我不想在恢复阶段的每个事件之后保存视图。
现在,当 ActorSystem 初始化(通过 Startup.cs 调用)时,日志阅读器就会启动。代码如下所示:
private static void InitialiseJournalReader()
{
// Obtain read journal by plugin id.
var readJournal = PersistenceQuery.Get(ActorSystem).ReadJournalFor<SqlReadJournal>("akka.persistence.query.myjournal");
// Materialize stream, consuming events.
var materializer = ActorMaterializer.Create(ActorSystem);
var writer = ActorSystem.ActorOf(CreateViewsActor.GetActorProps(), CreateViewsActor.GetActorName());
// issue query to journal
Source<EventEnvelope, NotUsed> source = readJournal.CurrentEventsByTag("MyEvents");
source.RunForeach(envelope => writer.Ask(envelope.Event), materializer);
}
CreateViewsActor
是一个 Actor,它使用消息来创建一个或多个视图。它还必须保存这些视图(当前以 JSON 格式保存到 SQL Server 表中)。
不幸的是,到目前为止,我还没有找到通过期刊阅读器创建持久视图的工作示例。但也许我一直在寻找错误的地方。到目前为止,我有以下问题:
- 有没有通过期刊阅读器创建持久视图的工作示例?
- CreateViewsActor(或任何负责创建和保存视图的代码)如何知道所有恢复消息都已处理?
- 初始化期刊阅读器的最佳位置是什么?