【问题标题】:Mongo Find slows downMongo Find 变慢
【发布时间】:2021-08-28 21:42:43
【问题描述】:

我正在使用 golang 的 mongo Db 包来查找文档。当我在 go 例程中运行多个 readMongo 函数时,运行 readMongo 函数所需的时间会增加。这是我机器的 I/O 限制吗?我正在阅读的文档小于 0.5MB。

func main(){

   go readMongo()
   go readMongo()
   go readMongo()

}

func go readMongo(){

  ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  defer cancel()
  client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
   if err != nil{
    //handle err
    }

     t1:=time.Now()
   collection := client.Database("Data").Collection("myCollection")

   if err := collection.FindOne(ctx,bson.M{"_id": "myKey"}).Decode(&data); err!= nil{}
  t2:=time.Now()
   fmt.Println(t2.sub(t1).Milliseconds())
 }

【问题讨论】:

    标签: database mongodb go


    【解决方案1】:

    首先:连接到数据库一次,并为所有 goroutines 使用相同的客户端。 mongodb 客户端管理连接池。

    随着并发的增加,单个读取的性能会下降,主要是因为网络带宽。所有并行读取将共享与数据库的相同连接,从而导致速度变慢。在您的示例中,您正在并行读取多个连接,导致读取共享网络带宽。在实际生产负载中,数据库流量通常是随机的,并且每个单独的 goroutine 的这种减速是不可预测的。

    【讨论】:

    • 我尝试对所有 goroutine 使用相同的客户端。随着 go 例程数量的增加,我仍然感到速度变慢
    • 正如我所说,速度会变慢,因为所有 goroutine 都共享同一个网络连接。
    • 谢谢。什么是可能的解决方案?
    • 有了足够大的数据,您可以使用 mongodb 分片,因此不同的数据库和连接将处理不同的查询。在您的情况下,没有解决方案,如果您与多个线程共享网络连接,您将看到每个线程的速度变慢。
    猜你喜欢
    • 2012-05-12
    • 2015-10-07
    • 2015-10-09
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2020-04-15
    • 2019-07-28
    相关资源
    最近更新 更多