Почему мои запросы 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?).

0 ответов

Другие вопросы по тегам