#go #load-testing #mongo-go
#Вперед #нагрузочное тестирование #mongo-go
Вопрос:
Я пытаюсь загрузить простой API go / mongo с помощью vegeta, но я получаю тайм-аут только во время тестирования POST
конечной точки.
Драйвер Mongo https://github.com/mongodb/mongo-go-driver
Обработчик
// CreateAccount handles creation of a new Account
func CreateAccount(w http.ResponseWriter, r *http.Request) {
var account schemas.Account
json.NewDecoder(r.Body).Decode(amp;account)
account.Name = RandStringBytes(10)
if err := account.Create(); err != nil {
log.Fatal(err)
} else {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(amp;account)
}
}
Учетная запись.Создать
// Create Creates an Account
func (acc *Account) Create() error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
acc.ID = primitive.NewObjectID()
if err := acc.hashPassword(); err != nil {
log.Fatal(err)
}
_, err := accountCollection.InsertOne(ctx, acc)
if err != nil {
return err
}
return nil
}
InitDb (вызывается в main.go)
func InitDb(databaseURI string) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
var err error
Db, err = mongo.Connect(ctx, options.Client().ApplyURI(databaseURI))
accountCollection = Db.Database(databaseName).Collection(accountCollectionName)
if err != nil {
log.Fatal(err)
}
if err = Db.Ping(ctx, readpref.Primary()); err != nil {
log.Fatal(err)
}
}
Конечные точки тестирования GET
работают так, как ожидалось. Единственная проблема связана с POST
конечной точкой
Выполнение простого jq -ncM '{method: "POST", url: "http://localhost:8080/accounts", body: "Punch!" | @base64, header: {"Content-Type": ["applicati/json"]}}' | vegeta attack -format=json -rate=100 | vegeta encode
для создания случайных пустых документов приведет к появлению следующих журналов:
httpserver:
(master) $ go run main.go
Server running :8080
2019/04/23 22:36:46 Error
2019/04/23 22:36:46 context deadline exceeded
exit status 1
mongo («ванильный» контейнер из официального docker-hub)
sudo docker run --rm -p 27017:27017 mongo
2019-04-24T01:35:43.128 0000 I NETWORK [listener] connection accepted from 172.17.0.1:34002 #1 (1 connection now open)
2019-04-24T01:36:46.193 0000 I NETWORK [conn1] end connection 172.17.0.1:34002 (0 connections now open)
вегета
$ jq -ncM '{method: "POST", url: "http://localhost:8080/accounts", body: "Punch!" | @base64, header: {"Content-Type": ["applicati/json"]}}' | vegeta attack -format=json -rate=50 | vegeta encode
{"attack":"","seq":1020,"code":0,"timestamp":"2019-04-24T01:39:27.355666931Z","latency":0,"bytes_out":0,"bytes_in":0,"error":"Post http://localhost:8080/accounts: dial tcp: lookup localhost: device or resource busy","body":null}
{"attack":"","seq":1021,"code":0,"timestamp":"2019-04-24T01:39:27.375672741Z","latency":0,"bytes_out":0,"bytes_in":0,"error":"Post http://localhost:8080/accounts: dial tcp: lookup localhost: device or resource busy","body":null}
{"attack":"","seq":1022,"code":0,"timestamp":"2019-04-24T01:39:27.395670955Z","latency":0,"bytes_out":0,"bytes_in":0,"error":"Post http://localhost:8080/accounts: dial tcp: lookup localhost: device or resource busy","body":null}
Если я сброшу -rate
до 5, это сработает, но он все еще зависает на 1 или 2 секунды между запросами.
Из-за ошибки http-сервера кажется, что go теряет соединение с mongo
Есть какие-либо советы о том, как его отладить дальше?