C# CosmosDB-DocumentDB-无饱和收集的批量插入

C# CosmosDB-DocumentDB-无饱和收集的批量插入,c#,azure,azure-cosmosdb,nosql,C#,Azure,Azure Cosmosdb,Nosql,我正在研究将Azure CosmosDB用于需要高读吞吐量和扩展能力的应用程序。99%的活动将被读取,但偶尔我们需要插入一些文档,从几个文档到可能的几百万个文档 我已经创建了一个要测试的集合,并设置了2500 RU/秒。然而,我甚至在插入120个小文档(500字节)时遇到了问题(我得到了“请求率很大”错误) 我怎么可能以任何有用的方式使用文档数据库,如果我想插入一些文档,它将使用我的所有RU并阻止任何人阅读它 是的,我可以增加RUs配置,但是如果我只需要2500次读取,我不想为了偶尔的插入而支付

我正在研究将Azure CosmosDB用于需要高读吞吐量和扩展能力的应用程序。99%的活动将被读取,但偶尔我们需要插入一些文档,从几个文档到可能的几百万个文档

我已经创建了一个要测试的集合,并设置了2500 RU/秒。然而,我甚至在插入120个小文档(500字节)时遇到了问题(我得到了“请求率很大”错误)

我怎么可能以任何有用的方式使用文档数据库,如果我想插入一些文档,它将使用我的所有RU并阻止任何人阅读它

是的,我可以增加RUs配置,但是如果我只需要2500次读取,我不想为了偶尔的插入而支付10000美元

阅读速度必须尽可能快,最好在微软广告的范围内。插入件不需要尽可能快,但越快越好

我曾尝试使用我所看到的建议的存储过程,但这也无法可靠地插入所有内容,我曾尝试按照答案中的建议使用多个线程创建自己的批量插入方法,但这会产生非常缓慢的结果,并且至少在某些文档中经常出错,而且似乎平均RU比率远低于我提供的比率


我觉得我肯定错过了一些东西,我是否需要为写作而大量地准备?是否有某种内置功能来限制RU用于插入?如何在合理的时间内插入数十万个文档,而不使集合无法使用?

更快插入的关键是将负载分布到多个物理分区。 在您的情况下,根据集合中的数据总量,您将拥有最少的totalvolume/10GB分区。 您的总RU平均分布在这些分区中

基于您的数据模型,如果您可以对数据进行分区,那么您可以通过并行地写入不同的分区来提高速度

由于您提到偶尔需要编写几百万行的批处理,因此我建议在这段时间内增加RU的容量,并将其降低到读取负载所需的级别

使用存储过程编写代码,虽然可以节省在网络上进行的调用,但可能不会带来太多好处,因为存储过程只能在单个分区上执行。因此,它只能使用分配给该分区的RU


关于什么样的分区是有意义的,有一些很好的指导。

如果您不能提高插入的成本,您可能会采取另一种方法,减慢过程,以使您的总体性能不受影响。如果您查看(哪些插入文档),您可以将此作为如何限制插入所需RU/s的想法。它显示了许多可以调整以提高性能的参数,但这些参数显然也可以用于将您的RU/s消耗量调整到一定的水平


KranthiKiran的回答几乎概括了我能想到的所有其他事情。

你也可以使用新的自动驾驶模式。在自动驾驶模式下配置的容器会调整容量以满足应用程序峰值负载的需要,并在活动激增结束时缩小。您需要指定最大吞吐量。

在某些情况下,可以批量插入数百万个文档。我们刚刚在我的公司做了一个练习,将100万条记录从Azure SQL DB中的各个表移动到CosmosDb

  • 理解CosmosDb分区非常重要。选择一个好的分区键,将数据分散在各个分区之间,这对于获得所需的吞吐量至关重要每个分区的最大RU/s吞吐量为10k。如果您试图将所有数据推到一个分区中,那么提供多少RU/s并不重要,因为任何超过10k的数据都是浪费的(假设您的容器没有发生任何其他事情)
  • 此外,每个逻辑分区的最大大小为20GB。一旦达到20GB大小,如果尝试添加更多记录,就会出现错误。明智地选择分区键的另一个原因
  • 使用批量插入。这提供了一个演练。有了最新的NuGet软件包,它的使用非常简单。我发现这段视频比docs.microsoft.com上的解释要好得多

如果看不到您的数据模式或分区,很难给出任何明确的信息,但是。。。您可以尝试将索引策略更改为lazy(从“一致”),以及更改索引策略以删除不需要索引的属性。这会降低每次插入每个文档的RU成本(但我无法告诉您这会为您节省多少)。@DavidMakogon谢谢,我可以尝试一下,但这似乎是在抵消问题,而不是解决问题。我可以这样做,它可能允许我插入一些文档,但下一次我可能需要插入更多文档,并再次出现这个问题,就像我说的,我不理解您的总体数据模型。但是还有一个想法:因为你只做偶尔插入,考虑启用每分钟RU爆裂,这给你一个10X的RU容量,分散在每分钟的时间周期。这可能会给您带来足够的开销来处理插入,每分钟的突发应该比固定的更高的RU速率更具成本效益。@DavidMakogon问题是我永远不会真正知道要插入多少数据,我应该计算所需的RU并在插入时更改它吗?或者,除非您对需要的RU数量有一个明确的定义,否则DocumentDB不适合吗?@Tom您的集合中是否启用了分区?通常,在高级别配置的RU/s均匀分布在逻辑分区中。