【问题标题】:How to create a Table-Like Reliable Collection如何创建类似表的可靠集合
【发布时间】:2016-07-29 00:19:08
【问题描述】:

创建类似表格的可靠集合的最佳方法是什么?我们可以扮演自己的角色吗?

我正在寻找一些东西来存储索引的简单列表或包,并跟踪键和其他简单的细节,因为枚举多分区字典的成本如此之高。最好是顺序访问而不是随机访问。

显而易见的选择:

  1. IDictionary <Guid, List> 存在并发问题,性能不佳
  2. 尝试枚举一个队列,但我怀疑它会比字典更好
  3. 使用外部数据存储

这些似乎都不是特别好。

【问题讨论】:

  • 有没有示例用法。有队列和字典可以解决 80% 的情况。你有什么挑战?
  • List 或 Collection 是我的数据......这样的数据很常见。
  • 这些可以存储在每个分区的基础上吗?从您下面的评论中,好像这是参考数据,需要在每个分区中使用。如果是这种情况,您是否可以在服务启动时加载它并从那时起使用。
  • 是的,计划是在服务启动时使用它们,但数据确实发生了变化。我当然可以在每个分区上复制。这是任何数据库的一个非常常见的场景,大约 2/3 的表将是小表,很少更改(但它们确实会更改)。显而易见的答案是对这些数据使用 Azure Table / SQL,但我希望是否有有效的 SF,例如 ReliableCollection
  • 您最好的选择可能是拥有另一个服务 - 可能是在每个节点上运行的无状态服务。启动时,此服务连接到外部存储以获取参考数据,然后通过 api 使其可用。通过这种方式,数据本地存储在内存中的每个系统上,并可通过处理分区的本地调用获得。

标签: azure-service-fabric


【解决方案1】:

分区实际上是为了获得性能。诀窍是以不需要跨分区查询的方式对数据进行分片。您还可以使用相同数据的不同聚合创建多个字典。 (使用交易)

在“分区计划”一章中阅读更多信息here

【讨论】:

  • 不确定是否分区数据是一个字符串[],我当然可以对其进行分区,但 70% 的调用将是 getAll ,10% 将进行顺序扫描。想想颜色、字典、索引、哈希集等。该服务还有一个海量字典,但需要这样的参考数据来完成它的工作。,
【解决方案2】:

当然,您可以推出自己的可靠收藏。毕竟,可靠的集合只是由 Azure 存储对象支持的内存中数据结构。如果你想要一个可靠的字符串列表,你可以实现IList<string>,并在各种方法(add、remove、getEnumerator、ecc.)中插入代码来跟踪、持久化数据结构。

根据您的内容,它可以是一个表(如果您可以生成一个好的分区/行键),或者只是一个 blob(您每次都对内容进行序列化/反序列化,或者在检查点,或者...您的政策!)

我不明白为什么IReliableDictionary<K, V> 不适合你。您是否需要存储键值对,并且出于性能原因不希望键分布在分区中? (因为“getAll”会产生机器?)

或者你只需​​要一个键列表(比如颜色,还是你在 HashSet 中的?)。

在任何情况下,根据数据的大小,您可以使用 IReliableDictionary 之类的方法对它们进行不同的分区,其中 int 可以只是一个(如“42”,您将拥有一个分区),也可以是几个(散列然后 mod (%) 你想要的数字),你会一次得到一大堆键(从每个键到 N 部分键)。

【讨论】:

  • 我认为你需要扮演自己的角色,但它们不是真实的例子......而且它有点棘手,因为你需要复制更改。
  • 是的 Hashset / 颜色是我现在使用的主要内容,但表也很有用我现在使用 Reliable 字典,但是在执行顺序扫描时它非常丑陋/缓慢,例如 IAsyncEnumerable over partitions.. 其中一个主要用途是主集合的索引,因此您不需要进行 Ienumerable 迭代。 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多