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

我的情况:

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

问题:

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

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

【问题讨论】:

标签: c# asp.net-web-api asp.net-web-api2 azure-service-fabric service-fabric-stateful


【解决方案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】:

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

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

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

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

【讨论】:

  • 对不起 - 我还是新手。 page in 和 page out 是什么意思?我见过其他人使用这个词,但我在网上找不到定义。
  • 可靠字典将所有可见状态保存在磁盘上。它还将状态的一部分保存在内存中以便快速访问。当 Reliable Dictionary 需要它在内存中没有的部分状态时,它会通过从磁盘读取它来将其加载到内存中。换句话说,将它分页。当内存中的状态变得太大时,它会从内存中删除一些。换句话说,将其翻页。这是对操作系统术语的重用:Paging
猜你喜欢
  • 2020-12-25
  • 2017-05-13
  • 2016-06-28
  • 2018-12-08
  • 2019-09-03
  • 2019-07-24
  • 2015-12-24
  • 2017-04-21
  • 2018-01-09
相关资源
最近更新 更多