Asp.Net核心身份+ EF核心+ CockroachDb =非常慢

时间:2020-04-08 14:42:23

标签: asp.net-core cockroachdb

我想将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生成唯一的数字,这会导致相当大的数字。蟑螂通过执行SET experimental_serial_normalization = sql_sequence提供了一种方法来覆盖当前会话的SERIAL关键字的行为。因此,我删除了所有表并再次应用了迁移,但是在执行此操作之前,已将执行上述命令的代码添加到AppDbContext的构造函数中。应用迁移后,可以删除此代码,因为不再需要它。

做所有这些事情使Identity可以与CockroachDb一起使用,但是它非常慢。创建新用户大约需要4秒钟。添加新的声明-大致相同。与PostgreSQL的〜1秒相比。

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

可能是什么问题?也许更改所有这些内容以使Identity与Cockroach一起工作会以某种方式使其混乱?从功能上讲,一切正常。

2 个答案:

答案 0 :(得分:0)

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

以下是release notes中该功能的摘录。

CockroachDB现在支持两种实验兼容模式,这些模式涉及PostgreSQL处理SERIAL和序列的方式,以简化对PostgreSQL开发的第三者框架或应用程序的重用。可以使用experimental_serial_normalization会话变量(每个客户端)和sql.defaults.serial_normalization集群设置(整个集群)启用这些模式。第一种模式virtual_sequence使使用SERIAL的许多应用程序具有最大的性能和可伸缩性兼容。第二种模式sql_sequence具有最大的PostgreSQL兼容性,但使用常规的SQL序列,因此受到性能的限制。

我认为理想的情况是不使用sql_sequence,并且应该固定所有内容,以便生成的数字不会溢出。可以通过以下两种方法之一来解决此问题:

答案 1 :(得分:0)

ASPNET Identity将允许您将GUID用作ID。如果您只是进行更改,其余的都可以正常工作,并且会执行相应的操作