У меня была куча проблем Миграция из 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 в главном? Это хорошая практика? И если да, то почему все примеры показывают, что он создается в дескрипторе вызова, и почему никогда не вызывается, чтобы закрыть соединение?
Спасибо!