Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 云firestore速度慢得令人痛苦_Go_Google Cloud Firestore_Gcloud - Fatal编程技术网

Go 云firestore速度慢得令人痛苦

Go 云firestore速度慢得令人痛苦,go,google-cloud-firestore,gcloud,Go,Google Cloud Firestore,Gcloud,到目前为止,我使用云sql作为后端数据库构建了一个项目 由于数据是在相当小的记录中结构化的,我认为,文档存储更适合它——特别是在postgres不容易扩展的情况下。所以我想尝试数据存储——它已被弃用,并被firestore取代——很好 我在一个集合中插入了一个文档,用一个表在云sql上创建了一个测试sql数据库,并插入了相同的记录,然后在Go中运行了一个简单的基准测试 sooo:*cloud sql postgres可以在firebase管理大约66(17.006.551 ns/op)个响应的同

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

由于数据是在相当小的记录中结构化的,我认为,文档存储更适合它——特别是在postgres不容易扩展的情况下。所以我想尝试数据存储——它已被弃用,并被firestore取代——很好

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

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

我一定是做错了什么。即使postgres不能扩展,它的速度也会减慢100倍,然后才能接近firestore的性能,在一个包含一个文档的集合中使用一个索引

我使用以下标志从
4核8GB ram计算实例运行基准测试:

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
    }
}
func基准测试(b*testing.b){
ctx:=context.Background()
client,:=firestore.NewClient(ctx,“project-123”,option.WithCredentialsFile(“key.json”))
延迟客户端。关闭()
对于n:=0;n
这是云sql(postgres)的一个:

func Benchmark\u sql(b*testing.b){
psqlInfo:=fmt.Sprintf(“主机=%s端口=%s用户=%s密码=%s数据库名=%s”+
“sslmode=require sslrootcert=server.chain.cert sslcert=client.cert sslkey=client.key”,
“ip地址0.0”、“5432”、“用户”、“密码”、“数据库”)
sqldb,ql:=sql.Open(“postgres”,psqlInfo)
stmt,\:=sqldb.Prepare(`selectproperty1,property2从pk=1的文档中;`)
延迟sqldb.Close()
对于n:=0;n
它是否配置了firestore?
我认为也有扳手和bigtable作为sql的替代品——但对于我的简单用例来说,它们的成本是巨大的(至少是估算,我发现这是不可替代的)

要解决性能问题,而不讨论如何度量问题,这是非常困难的,因为堆栈溢出是一个离题的话题。因此,我将尝试解释如何理解Firestore的性能特征,希望您能够将其映射回您看到的结果

Firestore的主要(也是非常独特的)性能保证是性能取决于结果集的大小,而不是集合的大小。简单地说:如果从(比如)1000个文档的集合中检索10个文档需要1秒,那么当集合包含1000000或100000000个文档时,检索这10个文档也需要1秒


请注意,这与实际性能无关,因为这取决于许多其他因素。它只说明随着集合的增长性能的变化。如:在这种情况下,性能不会改变。因此,当底层数据库增长时(通常在
O(n log n)
附近),大多数数据库的性能都会下降,但Firestore的性能是持平的(
O(1)
,或
O(10)
,在检索10个文档的示例中)。

我很快将Firestore性能的主要内在特征写在下面。但这并不能解释你看到了什么。我不确定我是否在分析你的结果是否正确,但如果真的需要17秒来检索单个文档,那么Firestore测试似乎在网络流量方面遇到了一些障碍,而你的其他测试没有。它实际上是17毫秒(我也总是忘了micro)。但差别是如此显著,而firestores的性能有点“正常”。我想我不知怎么搞砸了我的基准代码(可能启用连接池,或者pg客户端缓存结果,或者不检索结果集,诸如此类)
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()
    }
}