【问题标题】:High Performance Counters in Cloud SpannerCloud Spanner 中的高性能计数器
【发布时间】:2019-03-19 14:44:24
【问题描述】:

我希望继续统计帖子中的点赞数和 cmets 等项目。写入速率可能很高,例如1K 赞/秒。

即使结果集被索引,使用SELECT COUNT 似乎也不可行,因为可能有几百万行要计数。

我正在考虑使用分片计数器方法,其中特定计数器(喜欢给定帖子)由N shards/rows 组成。递增计数器将递增一个分片行的列值,而读取计数器将读取所有分片行并对计数值求和。使用 Spanner 的这种方法会有什么问题吗?

我了解在 Bigtable 中,对同一行的多次更新会在该行中创建新版本的单元格,因此,您可能会导致一行超出其大小限制。所以在 Bigtable 中使用行作为分片计数器似乎是个坏主意。 Spanner 有没有类似的问题?

【问题讨论】:

  • 对于 Bigtable 方面的事情,只要您有一个合理的 GC Policies,您可能不会担心行大小,并且您可以通过 ReadModifyWrite Increment 操作确保原子写入。跨度>

标签: google-cloud-bigtable google-cloud-spanner


【解决方案1】:

我了解在 Bigtable 中,对同一行的多次更新会 在行中创建新版本的单元格,因此,您可能会导致 超出其大小限制的行。所以使用行作为分片计数器 Bigtable 似乎是个坏主意。 Spanner 有没有类似的问题?

如 cmets 中所述,您可以使用 ReadModifyWrite Increment API,但需要注意的是 Bigtable 中的 ReadModifyWrite 等行事务操作速度较慢。

但是,使用多行表示单个计数器,然后使用前缀扫描一起读取这些行应该没问题。

关键是use arbitrary prefixes on the row key 在集群中的节点之间分配写入并避免热点。

【讨论】:

    【解决方案2】:

    对计数器进行分片以提高并行性似乎是个好主意。 Cloud Spanner 管理旧版本数据的方式与 BigTable 不同,因此您可能不会遇到相同的限制。 Spanner 将旧版本保留 1 小时左右。但是,您可能需要注意将架构设计为 avoid hotspots。

    我建议您尝试在 Spanner 之上实现内存缓存层。这可用于:

    1. 一起批量更新一些更新。
    2. 快速读取/计数。

    如果缓存消失,可能会丢失一些更新,但如果只是缓存喜欢/计数,这可能是可以接受的。

    【讨论】:

    • 谢谢!是的,我们计划有一个 Redis 缓存层来提供快速读取/计数。我们也考虑过批量写入,尽管这对我们来说更像是一个产品决策。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2019-11-10
    • 2021-12-10
    • 2020-01-05
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多