我已将PHP 7应用程序中的端点交换为新的Go服务。该服务采用地理边界框并从mongo数据库返回属性。问题是,它目前花费的时间是旧PHP服务执行相同操作的4-5倍。大约90%的时间花在了下面的GetProps函数中。
var session *mgo.Session
func connectToDB() *mgo.Session {
dialInfo := &mgo.DialInfo{
Addrs: []string{"xxx1.mongodb.net:27017", "xxx2.mongodb.net:27017", "xxx3.mongodb.net:27017"},
Database: "admin",
Username: "me",
Password: "xxx",
DialServer: func(addr *mgo.ServerAddr) (net.Conn, error) {
return tls.Dial("tcp", addr.String(), &tls.Config{})
},
Timeout: time.Second * 10,
}
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
log.Panic(err)
}
session.SetMode(mgo.Monotonic, true)
return session
}
func GetProps(propRequest Request) []Property {
results := make([]Property, 0)
sessionCopy := session.Copy()
defer sessionCopy.Close()
props := sessionCopy.DB("mapov").C("properties")
props.Find(bson.M{
"geo": bson.M{
"$geoWithin": bson.M{
"$geometry": bson.M{
"type": "Polygon",
"coordinates": propRequest.BoundingPoly,
},
},
},
}).Sort("-rank").Limit(propRequest.CpPropsRequired).All(&results)
return results
}
func init() {
session = connectToDB()
}
PHP 7服务几乎完全相同 -
$collection = $mapovdb->properties;
$query = ['geo' => [
'$geoWithin' => [
'$geometry' => [
'type' => 'Polygon',
'coordinates' => $boundingPoly
]
]
]];
$cursor = $collection->find( $query, $queryOptions); // $queryOptions includes the matching sort and limit
但它的速度更快(我将这两项服务彼此相邻运行12小时随机化流量)。
我尝试更改我的属性结构,因此只需要一个字段,但这似乎不会影响性能。
type Property struct {
Name string `bson:"name" json:"name"`
}
我做错了什么?当然我应该能够匹配php7驱动程序的性能?
更新
我已将fasthttp的内置http库换掉了。这似乎使一切都变得更快。我还没来得及解决原因(但是当我这样做时会回到这里)。我当前的理论是内置的http库为每个新的tcp连接创建一个新的goroutine而不是每个新的http连接,这导致我的db查询排队 - 因为负载均衡器正在重用tcp连接,或者因为客户端正在重用它们(HTTP / 2)。