Google Cloud Datatore Go Client не закрывает соединение по умолчанию? - PullRequest
0 голосов
/ 02 октября 2019

У меня была куча проблем Миграция из App Engine на Перейти 1.9 на 1.11 .

Я заметил, что использование памяти безумно выросло , когда я следовал руководству по миграции. Раньше он был постоянным ~ 50-60 МБ , но теперь он быстро вырос до 1,5 ГБ и экземпляры начали давать сбой.

Но затем я заметил, что все примеры, показывающие, как использовать хранилище данных GCP, просто заменили предыдущий

datastore.Get()

на

dsClient := datastore.NewClient(...) dsClient.get()

Затем, когда я посмотрел поближе на этого клиента, он создал соединение, но, кажется, никогда не закрывал его, поэтому, когда я добавил defer dsClient.Close() после создания нового клиента (в основном в каждом обработчике вызовов), память начала расти с ~ 60-80 МБ до ~ 500 МБ и затем упала;так продолжалось, но было стабильно, поэтому я решил, что время от времени проводил сборку. Однако через пару дней он снова потерпел неудачу, и запросы продолжались вечно, а новые экземпляры создавались до тех пор, пока не было достигнуто ограничение (ранее это происходило быстрее) .

Так что мне интересно, стоит ли мне просто создаватьвместо одного клиента Datastore в главном? Это хорошая практика? И если да, то почему все примеры показывают, что он создается в дескрипторе вызова, и почему никогда не вызывается, чтобы закрыть соединение?

Спасибо!

1 Ответ

2 голосов
/ 02 октября 2019

Я почти сделал то же самое, но Годок говорит, что нужно создать единого клиента и повторно использовать его для всех операций с хранилищем данных. Нет необходимости закрывать соединение.

    // Create a datastore client. In a typical application, you would create
    // a single client which is reused for every datastore operation.
    dsClient, err := datastore.NewClient(ctx, "my-project")
    if err != nil {
        // Handle error.
    }

https://godoc.org/cloud.google.com/go/datastore

...