Cloud Firestore变得非常缓慢

时间:2019-11-14 14:20:20

标签: go google-cloud-firestore gcloud

到目前为止,我使用Cloud sql作为后端数据库构建了一个项目。

我认为,由于数据是用很小的记录构成的,因此文档存储将更适合它-特别是因为postgres不容易扩展。所以我想尝试数据存储-已淘汰,并替换为 firestore -很好。

我将一个文档插入一个集合中,使用一个表在云sql上创建了一个测试sql数据库,并插入了相同的记录,然后在Go中运行了一个简单的基准测试。

Soooo:** cloud sql postgres 可以在Firebase管理大约66(17.006.551 ns / op)的同时返回6000(198.650 ns / op)响应。**

我在这里一定做错了。即使postgres不扩展,它也可以减慢100倍,使其接近Firestore的性能,在一个包含一个文档的集合上只有一个索引。

我使用以下标志从4-core, 8GB ram compute instance运行基准测试:

go test -bench=. -benchtime=1s -test.parallel=1 -cpu=1

这是我用于Firestore的基准:

func Benchmark_fetchSingle(b *testing.B) {

    ctx := context.Background()

    client, _ := firestore.NewClient(ctx, "project-123", option.WithCredentialsFile("key.json"))
    defer client.Close()
    for n := 0; n < b.N; n++ {
        c,_ := client.Collection("documents").Doc("DOCUMENTID").Get(ctx)
        c = c
    }
}

这是用于云sql(postgres)的版本:

func Benchmark_sql(b *testing.B) {
    psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s " +
        "sslmode=require sslrootcert=server.chain.cert sslcert=client.cert sslkey=client.key",
        "ip.address.0.0", "5432", "user", "password", "database")
    sqldb, _ := sql.Open("postgres", psqlInfo)
    stmt, _ := sqldb.Prepare(`select property1, property2 from documents where pk = $1;`)
    defer sqldb.Close()

    for n := 0; n < b.N; n++ {
        rows, _ := stmt.Query("DOCUMENTPK")

        rows.Next()
        stuff := struct{
            P1 string
            P2 string}{}
        rows.Scan(&(stuff.P1), &(stuff.P2))
        stuff = stuff
        rows.Close()
    }
}

是否未正确配置Firestore? 我认为也有spanner和bigtable作为no-sql的替代品-但它们的成本对于我的简单用例来说是巨大的(至少是估计,我发现这是不透明的)

1 个答案:

答案 0 :(得分:1)

要解决性能问题非常困难,而无需结束关于如何衡量事物的讨论,这在Stack Overflow上是不合时宜的。因此,我将尝试解释如何理解Firestore的性能特征,并希望您可以将其映射回所看到的结果。

Firestore的主要(也是非常独特的)性能保证是,性能取决于结果集的大小,而不取决于集合的大小。用简单的话来说:如果从(例如)1,000个文档的集合中检索10个文档需要1秒钟,而当该集合包含1,000,000或1,000,000,000个文档时,也将花费1秒来检索这10个文档。

请注意,这与实际性能无关,因为这取决于许多其他因素。它只是说说随着收藏的增长性能的变化。如:在这种情况下,性能不会改变。因此,尽管大多数数据库在基础数据库增长时(通常在O(n log n)附近)性能下降,但Firestore的性能却是平稳的(O(1),或者在检索10个文档的示例中为O(10))。 / p>