Visão geral
Neste guia, você aprenderá sobre a configuração de tempo limite único no driver Go, também conhecida como tempo limite de operação do lado do cliente (CSOT).
Ao usar o driver Go para executar uma operação de servidor , você também pode limitar o tempo em que o servidor pode concluir a operação. O tempo limite se aplica a todas as etapas necessárias para concluir a operação, incluindo seleção do servidor , verificação da conexão e execução do lado do servidor. Quando o tempo limite expira, o driver Go gera uma exceção de tempo limite.
Observação
Recurso experimental
O recurso CSOT é experimental e pode mudar em futuras versões de drivers.
Opção timeoutMS
Para especificar um tempo limite ao se conectar a um sistema do MongoDB , defina a opção de conexão timeoutMS
para o comprimento de tempo limite em milissegundos. Você pode definir a opção timeoutMS
das seguintes maneiras:
Chamando o método
SetTimeout()
ao especificar opções para sua instância doClient
Definindo o parâmetro
timeoutMS
em sua string de conexão
Os exemplos de código a seguir definem um tempo limite no nível do cliente de 200
milissegundos. Selecione a aba Client ou Connection
String para ver o código correspondente.
opts := options.Client().SetTimeout(200 * time.Millisecond) client, err := mongo.Connect(opts)
uri := "<connection string>/?timeoutMS=200" client, err := mongo.Connect(options.Client().ApplyURI(uri))
Observação
Novas tentativas com especificação de tempo limite
Se você definir um tempo limite no seu Client
ou em um contexto de nível de operação e o servidor retornar um erro repetível, o driver tentará novamente a operação quantas vezes forem possíveis antes que o tempo limite expire.
Quando o tempo limite expira, o driver retorna um erro de tempo limite. Consulte o manual do servidor para obter mais informações sobre leituras e gravações repetíveis.
Valores de tempo limite aceitos
A tabela seguinte descreve o comportamento de tempo limite correspondente aos valores aceitos para timeoutMS
:
Valor | Comportamento |
---|---|
número inteiro positivo | Define o tempo limite a ser usado para a conclusão da operação. |
| Especifica que as operações nunca expiram. |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS . |
Se você especificar a opção timeoutMS
, o driver aplicará automaticamente o tempo limite especificado para cada operação do servidor .
Herança de tempo limite
Por padrão, todas as operações no seu aplicação herdam a opção Timeout
do Client
se você não definir um tempo limite diferente em operações específicas no Contexto da operação.
Se você definir um tempo limite em um contexto passado para uma operação, o driver usará esse valor para a operação. Se você não especificar um timeout de contexto, a operação Contexto derivará o timeout da instância Client
.
A tabela a seguir descreve como o valor do tempo limite é herdado em cada nível:
Nível | Descrição da herança |
---|---|
(operação) | Tem a maior precedência e substitui as opções de tempo limite definidas em qualquer outro nível. |
transação | Tem precedência sobre o valor de tempo limite que você define no nível do cliente . |
Cliente | Aplica-se a todos os bancos de dados, collections, sessões, transações e operações dentro desse cliente que não especificam um tempo limite de contexto. |
Para obter mais informações sobre substituições e opções específicas, consulte a seguinte seção Substituições.
Substitui
O driver Go oferece suporte a vários níveis de configuração para controlar o comportamento e o desempenho das operações do banco de dados .
Você pode especificar uma opção timeoutMS
em um nível mais específico para substituir a configuração no nível do cliente. A tabela na seção anterior descreve os níveis nos quais você pode especificar uma configuração de tempo limite. Isso permite que você personalize os tempos limite com base nas necessidades de operações individuais.
O exemplo a seguir mostra como definir um tempo limite de nível de operação em um Contexto, que tem prioridade sobre o tempo limite de nível de cliente:
opts = options.Client().SetTimeout(200 * time.Millisecond) client, err = mongo.Connect(opts) if err != nil { log.Fatal(err) } coll := client.Database("db").Collection("people") ctx, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond) defer cancel() _, err = coll.InsertOne(ctx, bson.D{{"name", "Agnes Georgiou"}})
Transações
Ao executar uma transação usando o método WithTransaction(), você pode aplicar um tempo limite às operações de transação definindo um tempo limite no Contexto.
O código a seguir demonstra como definir um tempo limite de contexto ao chamar o método WithTransaction()
para executar uma transação:
txnContext, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond) defer cancel() result, err := session.WithTransaction(txnContext, func(ctx context.Context) (string, error) { // Perform transaction operations })
Se você não especificar um Tempo limite de contexto, o driver herdará o valor de tempo limite definido no Client
pai.
Você também pode passar tempos limite de contexto para os seguintes métodos de sessão:
AbortTransaction()
CommitTransaction()
EndSession()
Para saber mais sobre transações, consulte o guia Transações.
Cursors
Os cursores oferecem configurações de tempo limite configuráveis ao usar a funcionalidade CSOT. Você pode ajustar o tempo limite do cursor passando Contextos que tenham especificações de tempo limite para os métodos do Cursor.
Para operações que criam cursores, a configuração de tempo limite pode limitar a vida útil do cursor ou ser aplicada separadamente à operação original e a todas as chamadas subsequentes.
Por exemplo, se você passar um Tempo limite de contexto para o método Cursor.Next()
, o tempo limite se aplicará a cada ação para buscar um documento de resultado. Se você passar um Tempo limite de contexto para o método Cursor.All()
, o tempo limite se aplicará a toda a vida útil do cursor.
Para saber mais sobre cursores, consulte o guia Acessar dados de um cursor.
Documentação da API
Para saber mais sobre como usar tempos limite com o driver Go, consulte a seguinte documentação da API: