使用多个键调用 Service Fabric Reliable Dictionary

Posted

技术标签:

【中文标题】使用多个键调用 Service Fabric Reliable Dictionary【英文标题】:One call to Service Fabric Reliable Dictionary with multiple keys 【发布时间】:2017-05-08 10:21:34 【问题描述】:

我的情况:

包含我可靠字典的状态服务。 Stateless WebAPI 充当端点,以便我的其他 Web 应用程序可以与我的有状态服务通信。 我的其他 Web 应用程序每次页面加载都会访问我的无状态 WebAPI 超过 5000 次,以从我的可靠字典中获取数据。我知道我知道......我是继承这个遗留代码的幸运儿。

问题:

每次调用的延迟大约为 100 毫秒(如果这有什么不同,我会在本地进行调试),但乘以 5000,我们现在谈论的是分钟。

而不是传递密钥来调用我的可靠字典超过 5000 次...我可以使用多个密钥对 Service Fabric 进行一次调用吗?

【问题讨论】:

What would be the best way to search an IReliableDictionary?的可能重复 【参考方案1】:

您可以在 IReliableDictionary https://gist.github.com/aelij/987d974c811865029564f1bbeffb6b47 上使用 Eli Arbel 的扩展。类似的东西

      ` var data= await YouReliableDictionary;
        var values= (await data.CreateLinqAsyncEnumerable(txn))
            .Where(x => youMultipleKeys.Contains(x.Key))
            .Select(x=>x.Value)

【讨论】:

我的 LINQ 有点生疏了。这不只返回一个值吗?我想以某种方式传入一个键列表并返回一个值列表/字典。 这正是 select 正在做的事情。它将返回与 Where 条件匹配的值的 IEnumerable(或在本例中为 IAsyncEnumerable)【参考方案2】:

值得分析延迟以查看时间花费在哪里。想到的两个可能的罪魁祸首是

    无状态前端与有状态后端之间的通信 可靠的 Dictionary 执行磁盘 IO 以分页调出的值以提供读取服务。

由于您在本地运行,我假设首先不是问题。但是,批处理对后端服务的读取调用将是减少服务之间往返次数的好主意。您还可以考虑为不需要来自权威存储的读取设置缓存。既然你控制着通讯,这一切都在你的掌控之中。

如果第二个是当前的瓶颈,Reliable Dictionary 并没有公开一种机制来批量读取以减少今天的磁盘 IO 数量。如果您愿意为低延迟读取增加内存使用量,那么您可以使用Reliable Dictionary Notifications 来构建您希望从中读取低延迟的可靠字典的内存缓存。

【讨论】:

对不起 - 我还是新手。 page in 和 page out 是什么意思?我见过其他人使用这个词,但我在网上找不到定义。 可靠字典将所有可见状态保存在磁盘上。它还将状态的一部分保存在内存中以便快速访问。当 Reliable Dictionary 需要它在内存中没有的部分状态时,它会通过从磁盘读取它来将其加载到内存中。换句话说,将它分页。当内存中的状态变得太大时,它会从内存中删除一些。换句话说,将其翻页。这是对操作系统术语的重用:Paging。

以上是关于使用多个键调用 Service Fabric Reliable Dictionary的主要内容,如果未能解决你的问题,请参考以下文章

Service Fabric 具有不同 ContractDescriptions 的多个 ServiceEndpoint

Service Fabric 多个 SSL 安全 WebAPI 和证书翻转

从 .net 核心调用 Service Fabric

在 Service Fabric Mesh 中公开多个服务

从 .Net Core Stateless Service 调用 .Net 框架 Service Fabric Actor

使用自托管 Azure Service Fabric 调用 Web API 时出错