Почему мои запросы MGO работают медленнее, чем в php
Я поменял конечную точку из нашего приложения PHP 7 на новый сервис Go. Служба принимает географическую ограничительную рамку и возвращает свойства из базы данных Монго. Проблема в том, что в настоящее время это занимает в 4-5 раз больше времени, чем старый PHP-сервис занимался тем же. ~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?
ОБНОВИТЬ
Я поменял встроенную http-библиотеку на fasthttp. Это, кажется, сделало все быстрее. У меня еще не было времени, чтобы выяснить, почему (но я вернусь сюда, когда я это сделаю). Моя текущая теория заключается в том, что встроенная библиотека http создает новую процедуру для каждого нового соединения tcp, а не для каждого нового соединения http, и это приводит к тому, что мои db-запросы ставятся в очередь - либо потому, что балансировщик нагрузки повторно использует соединения tcp, либо потому что клиент использует их повторно (HTTP /2?).