Azure表删除模式-删除旧项目

Azure表删除模式-删除旧项目,azure,azure-storage,azure-table-storage,Azure,Azure Storage,Azure Table Storage,我正在使用Azure表(存储)来存储我正在使用的网站的信息。所以,我计划了这个结构: 分区键-域名 行键-网页地址 有效期至(日期-时间)-在此日期之后,记录将被删除 这里还有其他重要数据 这些列将存储在一个称为网站地址的表中(例如“cnn.com”) 我有两个主要用例(从高到低): 1.检查URL“x”是否在表中-通过分区键和行键的组合查找-非常有效。 2.删除旧数据-删除所有过期数据(根据“有效期至”列)。这项行动每天午夜都在进行,可能会删除数百万行-非常繁重 因此,我们的第一个任务(检查U

我正在使用Azure表(存储)来存储我正在使用的网站的信息。所以,我计划了这个结构:

  • 分区键-域名
  • 行键-网页地址
  • 有效期至(日期-时间)-在此日期之后,记录将被删除
  • 这里还有其他重要数据
  • 这些列将存储在一个称为网站地址的表中(例如“cnn.com”)

    我有两个主要用例(从高到低): 1.检查URL“x”是否在表中-通过分区键和行键的组合查找-非常有效。 2.删除旧数据-删除所有过期数据(根据“有效期至”列)。这项行动每天午夜都在进行,可能会删除数百万行-非常繁重

    因此,我们的第一个任务(检查URL是否存在)是使用此数据模型以有效的方式实现的。第二个任务,不是。我想避免批量删除

    我还担心制造“热点”,这会使我表现不佳。这是因为分区键。我希望在几个小时内,我会查询特定领域的更多问题。这将使这个分区成为热点,并影响我的性能。为了避免这种情况,我想使用散列函数(在URL上),结果将是“分区键”。这是个好主意吗

    我也考虑过其他的实现方式,看起来他们有一些问题:

    • 将以删除日期命名的行存储在表中(例如“cnn.com-1-1-2016”)。这为我们提供了很好的性能。但是,搜索体验不好(该行可以存在于多个表中,例如“cnn.com-1-1-2016”或“cnn.com-2-1-2016”…)
    我的问题的正确解决方案是什么?

    你看到答案了吗?它描述了大规模设计表解决方案的原则和模式。对于热点,请查看prepend/append反模式以获取更多信息。这是所有操作都发生在单个分区内的地方,这样可以防止添加额外的资源。对于这些类型的场景,如果可以跨分区分发操作,则可以获得更好的可伸缩性

  • 假设你有一个网站。您可以将PK保留为域名+“/news/”+2个字母的页面地址、摘要。RK-完整地址的其他部分。这将在近1000个分区上拆分域分区。如果这还不够-在PK中使用3个第一个字母

  • 每15分钟删除一次过时数据(为其创建单独的服务)。你的百万只会变成几万。或者保存更少的数据(例如,2周而不是1个月)。不要忘记优化删除(仅获取PK和RK,将ETag更新为“*”,将其作为DynamicTableEntity删除,如果可能,请批量删除)

  • 没有“正确”的答案-这是一个广泛的主题,有很多可能的解决方案(为删除引用添加额外的表;为删除可搜索的数据使用备用数据库;等等)。至于“热点”,这将取决于您的基准测试(因为每个分区提供多达2000个事务/秒)。