-1

我正在努力解决我们的登录过程中的一些主要延迟问题,并且在对 Identtiy Server 4 进行大量日志记录时,我发现每次登录时都会运行一组重复的查询。

在此处输入图像描述

有没有使用 IS4 经验的人知道为什么会发生这种情况或可以做些什么?这些调用似乎来自 IS4 的中间件,而不是我们的任何自定义代码。

编辑:我在我的数据库中添加了一些跟踪查询,并发现以下内容:

这些查询集在整个登录过程中运行了大约 7 次。其他查询也会运行,但这些查询特别运行七次。

我知道以这种方式使用查询存储,但我对存储的执行计划和数据如何工作的理解,如果传入了不同的参数,它将在其中一个表中显示为新行(查询存储或 query_store_plan)。由于查询存储中每个查询只有一行,每行一个计划,我的结论是它只寻找一个特定的客户端 ID。我们称该客户端为“AdminTool”

在登录过程中运行相同的查询七次似乎非常低效。我确信其中一些与令牌生成和其他数据无法持久化的事情有关,但七个似乎仍然过多。

执行计划中的一个示例查询是:

 SELECT [x.IdentityProviderRestrictions].[Id], [x.IdentityProviderRestrictions].[ClientId],
 [x.IdentityProviderRestrictions].[Provider] 
 FROM [ClientIdPRestrictions] AS [x.IdentityProviderRestrictions]
 INNER JOIN (SELECT TOP(1) [x6].[Id] FROM [Clients] AS [x6] 
            WHERE [x6].[ClientId] = @__clientId_0
            ORDER BY [x6].[Id]) 
            AS [t5] 
 ON [x.IdentityProviderRestrictions].[ClientId] = [t5].[Id]
 ORDER BY [t5].[Id]

执行计划的参数列表包括:

 <ColumnReference Column="@__clientId_0" ParameterDataType="nvarchar(200)"
     ParameterCompiledValue="N'AdminTool'" />
4

1 回答 1

2

IdentityServer 附带了一些简单的缓存组件,但默认情况下它们未配置为使用。

这意味着,如果您使用的是数据库支持的存储(用于客户端、资源等),那么对该存储的每次访问都会生成数据库工作。在 IdentityServer 的任何常见使用过程中,这些商店都会受到多次打击。

Caching文档部分讨论了如何安装基于内存缓存的简单组件。如果您想自己实现缓存,还有更高级的主题,我相信有一个包(不知道它的官方状态)可以使用 Redis 进行缓存。

于 2018-07-27T14:28:34.563 回答