Akka.net | MongoDB 只加载一个事件
Akka.net | MongoDB only loads one event
我目前正在与 akka 合作开展一个新项目。但是现在我遇到了一个问题。
我向我的项目添加了一个 mongo 数据库并设置了日志和快照存储。我可以持久化事件,事件将存储在数据库中。效果很好。
但是当我重新启动应用程序并且 actor 开始恢复事件时,actor 只恢复了第一个事件。 Recovery upper SequenceNr Limit 似乎设置为 1,但我已经检查过了。
在第一个事件恢复后,actor 收到消息 RecoveryCompleted 并且恢复过程完成。
恢复方法
private void recovers()
{
Recover<TenantCreated>(evt =>
{
applyEvent(evt);
Context.System.EventStream.Publish(evt);
});
Recover<TenantDeleted>(evt =>
{
applyEvent(evt);
Context.System.EventStream.Publish(evt);
});
Recover<SnapshotOffer>(snapshot =>
{
this.state = (TenantCollection)snapshot.Snapshot;
});
Recover<RecoveryCompleted>(msg =>
{
});
}
一种持久化事件的方法
Command<CreateTenant>(command =>
{
Persist(new TenantCreated(command.Id, command.UserId, command.Name, new Guid(command.Id).ToString("N")), evt =>
{
var newTenant = applyEvent(evt);
newTenant.Tell(command);
persistAndPublishEvent(evt);
});
});
我的akka配置。
connectionString 将加载后备。有了这个,我可以将 connectionString 设置为环境变量。
persistence {
journal {
plugin = "akka.persistence.journal.mongodb"
mongodb {
class = "Akka.Persistence.MongoDb.Journal.MongoDbJournal, Akka.Persistence.MongoDb"
collection = "EventJournal"
plugin-dispatcher = "akka.actor.default-dispatcher"
}
}
snapshot-store {
plugin = "akka.persistence.snapshot-store.mongodb"
mongodb {
class = "Akka.Persistence.MongoDb.Snapshot.MongoDbSnapshotStore, Akka.Persistence.MongoDb"
collection = "SnapshotStore"
plugin-dispatcher = "akka.actor.default-dispatcher"
}
}
}
有什么问题?
有没有人遇到同样的问题?
我发现了问题。
我将我的 nuget 包 akka.persistence.mongoDb 从 1.4.19 降级到 1.4.14 然后它工作了。
在 1.4.19 中,akka 只会创建一个 EventJournal 集合。缺少元数据集合。
对于 4.1.14,akka 还会创建元数据集合。
也许我使用 MongoDb 不正确,但这对我有用。
是的,看起来这毕竟是一个错误 - 删除元数据 table 暴露了它。
这是因为默认情况下我们不对集合应用索引(从表面上看,从来没有——我们错过了,因为我们的测试套件中的配置不同:) https://github.com/akkadotnet/Akka.Persistence.MongoDB/blob/552a29eed4c839fe4f91fceeb70bb29eb17d1315/src/Akka.Persistence.MongoDb/reference.conf#L11
所以这真的很有帮助 - 事实证明我们的大用户从来没有遇到过这个问题,因为他们一直 运行 在他们的配置中使用 auto-initialize=on
。您受到默认设置不同的影响。
https://github.com/akkadotnet/Akka.Persistence.MongoDB/releases/tag/1.4.21 - 我们发布了 Akka.NET v1.4.21 解决了这个问题。
我目前正在与 akka 合作开展一个新项目。但是现在我遇到了一个问题。
我向我的项目添加了一个 mongo 数据库并设置了日志和快照存储。我可以持久化事件,事件将存储在数据库中。效果很好。
但是当我重新启动应用程序并且 actor 开始恢复事件时,actor 只恢复了第一个事件。 Recovery upper SequenceNr Limit 似乎设置为 1,但我已经检查过了。 在第一个事件恢复后,actor 收到消息 RecoveryCompleted 并且恢复过程完成。
恢复方法
private void recovers()
{
Recover<TenantCreated>(evt =>
{
applyEvent(evt);
Context.System.EventStream.Publish(evt);
});
Recover<TenantDeleted>(evt =>
{
applyEvent(evt);
Context.System.EventStream.Publish(evt);
});
Recover<SnapshotOffer>(snapshot =>
{
this.state = (TenantCollection)snapshot.Snapshot;
});
Recover<RecoveryCompleted>(msg =>
{
});
}
一种持久化事件的方法
Command<CreateTenant>(command =>
{
Persist(new TenantCreated(command.Id, command.UserId, command.Name, new Guid(command.Id).ToString("N")), evt =>
{
var newTenant = applyEvent(evt);
newTenant.Tell(command);
persistAndPublishEvent(evt);
});
});
我的akka配置。 connectionString 将加载后备。有了这个,我可以将 connectionString 设置为环境变量。
persistence {
journal {
plugin = "akka.persistence.journal.mongodb"
mongodb {
class = "Akka.Persistence.MongoDb.Journal.MongoDbJournal, Akka.Persistence.MongoDb"
collection = "EventJournal"
plugin-dispatcher = "akka.actor.default-dispatcher"
}
}
snapshot-store {
plugin = "akka.persistence.snapshot-store.mongodb"
mongodb {
class = "Akka.Persistence.MongoDb.Snapshot.MongoDbSnapshotStore, Akka.Persistence.MongoDb"
collection = "SnapshotStore"
plugin-dispatcher = "akka.actor.default-dispatcher"
}
}
}
有什么问题?
有没有人遇到同样的问题?
我发现了问题。
我将我的 nuget 包 akka.persistence.mongoDb 从 1.4.19 降级到 1.4.14 然后它工作了。 在 1.4.19 中,akka 只会创建一个 EventJournal 集合。缺少元数据集合。
对于 4.1.14,akka 还会创建元数据集合。
也许我使用 MongoDb 不正确,但这对我有用。
是的,看起来这毕竟是一个错误 - 删除元数据 table 暴露了它。
这是因为默认情况下我们不对集合应用索引(从表面上看,从来没有——我们错过了,因为我们的测试套件中的配置不同:) https://github.com/akkadotnet/Akka.Persistence.MongoDB/blob/552a29eed4c839fe4f91fceeb70bb29eb17d1315/src/Akka.Persistence.MongoDb/reference.conf#L11
所以这真的很有帮助 - 事实证明我们的大用户从来没有遇到过这个问题,因为他们一直 运行 在他们的配置中使用 auto-initialize=on
。您受到默认设置不同的影响。
https://github.com/akkadotnet/Akka.Persistence.MongoDB/releases/tag/1.4.21 - 我们发布了 Akka.NET v1.4.21 解决了这个问题。