Должен ли быть новый datastore.Client для каждого HTTP-запроса? - PullRequest
1 голос
/ 20 января 2020

Официальная документация Go для пакета хранилища данных (клиентская библиотека для службы хранилища данных GCP) содержит следующий фрагмент кода для демонстрации:

type Entity struct {
    Value string
}

func main() {
    ctx := context.Background()

    // 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.
    }

    k := datastore.NameKey("Entity", "stringID", nil)
    e := new(Entity)
    if err := dsClient.Get(ctx, k, e); err != nil {
        // Handle error.
    }

    old := e.Value
    e.Value = "Hello World!"

    if _, err := dsClient.Put(ctx, k, e); err != nil {
        // Handle error.
    }

    fmt.Printf("Updated value from %q to %q\n", old, e.Value)
}

Как видно, в нем говорится, что в идеале datastore.Client должен создаваться только один раз в приложении. Теперь, учитывая, что для функции datastore.NewClient требуется объект context.Context, означает ли это, что он должен создаваться только один раз за HTTP-запрос или его можно безопасно создать один раз глобально с объектом context.Background()?

Каждая операция снова требуется объект context.Context (например, dsClient.Get(ctx, k, e)), поэтому нужно ли использовать контекст HTTP-запроса?

Я новичок в Go и не могу найти какие-либо онлайн-ресурсы которые очень хорошо объясняют что-то подобное, с примерами из реальной жизни и примерами лучших практик.

1 Ответ

2 голосов
/ 20 января 2020

Вы можете использовать любой context.Context для создания клиента хранилища данных, это может быть context.Background(), это вполне нормально. Создание клиента может занять много времени, может потребоваться подключение к удаленному серверу, аутентификация, загрузка конфигурации и т. Д. c. Если ваш вариант использования имеет ограниченное время, вы можете передать контекст с таймаутом, чтобы прервать операцию. Кроме того, если создание занимает больше времени, чем у вас есть, вы можете использовать контекст с отменой и отменой миссии по вашему желанию. Это просто варианты, которые вы можете или не можете использовать. Но «инструменты» передаются через context.Context.

Позже, когда вы используете datastore.Client во время обслуживания (HTTP) клиентских запросов, тогда использование контекста запроса целесообразно, поэтому если запрос отменяется, то же происходит и с контекстом, и так же справедливо выполняется операция хранилища данных, потому что если клиент не может увидеть результат, то нет смысла завершать запрос. Завершая запрос досрочно, вы можете не использовать определенные ресурсы (например, чтение хранилища данных) и снизить нагрузку на сервер (прерывая задания, результаты которых не будут отправлены обратно клиенту).

...