如何解决 aws Keyspaces 中的“范围删除请求限制在单个范围内可以删除的项目数量”问题?

问题描述

我在 C# 中使用 Aws Keyspaces,首先我从表中选择以按分区键删除,然后尝试使用 where 子句从表中删除许多行:

 var daysToDelete = DateTimeOffset.UtcNow.AddDays(-1);
     foreach (var result in selectResult)
                {
                    Cql deleteQuery = new Cql("WHERE interfaceid = ? and environment = ? and transactionguid < ?",result .InterfaceId,result .Environment,TimeUuid.Min(daysToDelete)).WithOptions(o => o.SetPageSize(100));
                    mapper.Delete<Transaction>(deleteQuery);
                }

大约有 3k - 6k 行,而我正在尝试删除这些行 我收到一个错误

"范围删除请求的数量有限 可以在单个范围内删除的项目"

我该如何解决这个问题?

解决方法

这是一个 known limitation of AWS Keyspaces。一种可能的解决方案是:

  • select transactionguid WHERE interfaceid = ? and environment = ? and transactionguid < ?
  • 当您跨越千、两千等边界时,记住 transactionguid 对结果进行迭代。
  • 在记住的边界上迭代执行 delete

附言为什么不使用更兼容的云 Cassandra,比如 DataStax Astra 或类似的东西? AWS Keyspaces 不是真正的 Cassandra,因此您始终需要自己处理限制。

,

使用亚马逊密钥空间,you can delete up to 1,000 rows within a range in a single operation。要删除单个分区中的 1,000 多行,最好按较小的范围拆分操作或迭代主键。

  • 首先尝试按分区删除 - 如果大多数分区少于 1,000 行,最好尝试按分区删除。如果分区包含超过 1,000 行,请尝试通过聚类列删除。
  • 按聚类列删除——如果您的模型包含多个聚类列,您可以使用列层次结构删除多行。聚类列是嵌套结构,您可以通过对顶级列进行操作来删除许多项。
  • 按单行删除 - 遍历项目并按其完整主键(分区列和集群列)删除每一行。
  • 还要考虑将行拆分到多个分区上。在 NoSQL 中,最好跨表分区分配吞吐量。这会在物理资源之间均匀分布数据和访问,从而提供最佳吞吐量。

还要考虑以下有关删除繁重工作负载的事项。

  • 使用 Amazon Keyspaces,CQL 分区可以包含几乎无限数量的行。这允许您扩展比传统 Cassandra 指导 100 MB 更“宽”的分区。随着时间的推移,时间序列或平台的数据量超过 GB 的情况并不少见。
  • 使用 Amazon Keyspaces,当您删除繁重的工作负载时,无需考虑压缩策略或逻辑删除。您可以随意删除,而不会影响读取性能。