【问题标题】:Asp.Net Core Identity + EF Core + CockroachDb = very slowAsp.Net Core Identity + EF Core + CockroachDb = 非常慢
【发布时间】:2020-07-21 00:37:50
【问题描述】:

我想将 CockroachDb 与 Asp.Net Core Identity 一起使用。 Cockroach 使用 Postgres 的有线协议,因此 Npgsql.EntityFrameworkCore.PostgreSQL 包也适用于 Cockroach。

简单地添加所有必要的服务、生成迁移并应用它是行不通的,因为生成的迁移使用NpgsqlValueGenerationStrategy.IdentityByDefaultColumn,这导致列带有 GENERATED BY DEFAULT AS IDENTITY,Cockroach 不支持。所以我在所有生成的迁移文件(迁移、设计器、模型快照)中将NpgsqlValueGenerationStrategy 更改为SerialColumn。在此更改应用迁移后,调用UserManager.AddClaim 时出现另一个错误。溢出异常。所以我认为这是因为默认情况下,用于 SERIAL 列的 Cockroach 不使用序列,而是根据当前时间戳和节点 ID 生成唯一数字,这会产生一些非常大的数字。 Cockroach 提供了一种通过执行SET experimental_serial_normalization = sql_sequence 来覆盖当前会话的SERIAL 关键字行为的方法。所以我删除了所有表并再次应用迁移,但在此之前将执行上述命令的代码添加到 AppDbContext 的构造函数。应用迁移后,可以删除此代码,因为不再需要它。

完成所有这些操作后,Identity 才能与 CockroachDb 一起使用,但速度非常慢。创建新用户大约需要 4 秒。添加新声明 - 大致相同。与 PostgreSQL 的 ~1 秒相比。

在 Identity 之外将 EF Core 与 Cockroach 一起使用会很慢,但并非不合理。但是将 EF Core 和 Cockroach 与 Identity 结合使用会使性能无法接受。

可能是什么问题?也许改变所有这些东西以使 Identity 与 Cockroach 一起工作会以某种方式搞砸?功能方面一切正常。

【问题讨论】:

    标签: asp.net-core cockroachdb


    【解决方案1】:

    ASPNET Identity 将允许您使用 GUID 作为 Id。如果你只是改变它,其余的将毫无问题地工作并相应地执行

    【讨论】:

    【解决方案2】:

    sql_sequence 设置预计会更慢,因为它增加了集群中不同节点之间的大量协调,以确保序列递增一。

    这里是来自release notes 的此功能的摘录。

    CockroachDB 现在支持两种实验性兼容模式,用于 PostgreSQL 如何处理 SERIAL 和序列,以简化为 PostgreSQL 开发的第 3 方框架或应用程序的重用。这些模式可以通过experimental_serial_normalization 会话变量(每个客户端)和sql.defaults.serial_normalization 集群设置(集群范围)启用。第一种模式 virtual_sequence 可以与许多使用 SERIAL 的应用程序兼容,并具有最大的性能和可扩展性。第二种模式 sql_sequence 实现了最大的 PostgreSQL 兼容性,但使用常规 SQL 序列,因此受到性能限制。

    我认为理想的做法是不使用sql_sequence,并且应该修复问题,以便生成的数字不会溢出。这可以通过以下两种方式之一解决:

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2021-07-15
      • 2018-12-27
      • 2021-09-14
      • 2018-07-17
      • 2018-01-08
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多