【问题标题】:Akka.Net PersistenceQuery not returning all resultsAkka.Net PersistenceQuery 不返回所有结果
【发布时间】:2018-05-07 15:30:34
【问题描述】:

我正在使用 Akka.Net (v 1.3.2) 并尝试在事件日志中查询具有特定标签的所有事件。我只想要查询日志时存在的事件。在演员内部,我有以下代码:

var readJournal = PersistenceQuery.Get(Context.System).ReadJournalFor<SqlReadJournal>(SqlReadJournal.Identifier);
var stream = readJournal.CurrentEventsByTag("The Tag Name", Offset.NoOffset());
var materializer = ActorMaterializer.Create(Context.System);

stream.RunForeach(envelope =>
{
    // Do some stuff with the EventEnvelope
}, materializer).Wait();

这将成功查询事件日志。但是,问题是它只会返回前 100 个事件。我需要 所有 与查询匹配的!

问题:如何删除通过标签名称查询事件日志时存在的限制/过滤器?

如果需要,这里是我的 akka.persistence 配置:

var config = Akka.Configuration.ConfigurationFactory.ParseString(@"
    akka.persistence {
        journal {
            plugin = ""akka.persistence.journal.sql-server""
            sql-server {
                class = ""Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer""
                connection-string = """ + connectionString + @"""
                schema-name = dbo
                table-name = __akka_EventJournal
                metadata-table-name = __akka_Metadata
                auto-initialize = on
            }
        }

        snapshot-store {
            plugin = ""akka.persistence.snapshot-store.sql-server""
            sql-server {
                class = ""Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer""
                connection-string = """ + connectionString + @"""
                schema-name = dbo
                table-name = __akka_SnapshotStore
                auto-initialize = on
            }
        }
    }"
);

【问题讨论】:

    标签: akka-stream akka.net


    【解决方案1】:

    有两件事要检查:

    1. 您可以通过设置akka.persistence.query.journal.sql.max-buffer-size 值来设置一次查询中返回的最大消息数(参见:reference.conf)。
    2. 使用readJournal.EventsByTag 而不是readJournal.CurrentEventsByTag 来获取连续的事件流。请记住,它不会自行完成,而是会继续等待新事件的到来。您可以明确停止它,即使用KillSwitch

    【讨论】:

    • max-buffer-size 设置为 2147483647 (int.MaxLength) 有什么害处吗?比如我的应用程序在查询大量事件时会开始受到性能影响吗?更改 max-buffer-size 有效,但我阅读的文档让我有点担心随着我的事件日志的增长对性能的影响。
    • 最大缓冲区大小本质上应用 LIMIT 等效于您的数据库查询。查询执行后,使用DbDataReader.ReadAsync 方法选择数据库回复。因此,当您的事件日志很大时,响应能力可能会受到影响。
    猜你喜欢
    • 2021-06-21
    • 2015-10-23
    • 2012-06-08
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多