我正在使用Azure Table(存储)来存储有关我正在使用的网站的信息。所以,我计划了这个结构:
这些列将存储在一个名为网站地址的表格中(例如" cnn.com")。
我有两个主要用例(从高到低): 1.检查URL" x"在表中 - 通过分区键和行键的组合查找 - 非常有效。 2.删除旧数据 - 删除所有过期数据(根据"有效期至"列)。这项操作每隔一个中午进行,可能会删除数百万行 - 非常重。
因此,我们的第一个任务(检查URL是否存在)是使用此数据模型以高效方式实现的。 第二项任务,不是。我想避免批量删除。
我也担心制作"热点",这会让我性能低下。这是因为分区键。我希望在几个小时内,我会查询特定域名的更多问题。这将使这个分区成为热点并达到我的性能。为了避免这种情况,我想使用哈希函数(在URL上),结果将是"分区键"。这是个好主意吗?
我还考虑过其他实现方式,看起来他们遇到了一些问题:
对我的问题有什么正确的解决方案?
答案 0 :(得分:0)
你见过Azure Table Storage Design Guide吗?它描述了大规模设计表解决方案的原则和模式。对于热点,请查看前置/附加反模式以获取一些额外信息。这是您在单个分区中进行所有操作的地方,这会阻止添加其他资源。对于这些类型的场景,如果您可以跨分区分发操作,则可以获得更好的扩展。
答案 1 :(得分:0)
假设您有一个网站https://www.yahoo.com/news/death-omar-al-shishani-could-mean-war-against-203132664.html?nhp=1。您可以将PK保留为domainName +" / news /" + 2个页面地址,摘要https://www.yahoo.com/news/de。 RK - 完整地址的其他部分。这将在近1000个分区上拆分域分区。如果这还不够 - 在PK中使用3个第一个字母。
每15分钟删除一次过时的数据(为其创建单独的服务)。你的数百万人将变成数万人。或者保留较少的数据(2周而不是月份for.ex.)。并且不要忘记优化删除(仅获取PK和RK,将ETag更新为" *",如果可能,删除为DynamicTableEntity,批量处理。)