Menu Docs
Página inicial do Docs
/ / /
Driver GO
/

Contexto

Nesta página

  • Visão geral
  • Expiração
  • Seleção do Servidor
  • Checkout de Conexão
  • Estabelecimento de Conexão
  • Leitura e escrita de soquete

O driver Go do MongoDB usa o pacote de contexto da biblioteca padrão do Go para permitir que os aplicativos sinalizem tempos limite e cancelamentos para qualquer chamada de método de bloqueio . Um método de bloqueio depende de um evento externo, como uma entrada ou saída de rede, para prosseguir com sua tarefa.

Um exemplo de um método de bloqueio no Go Driver é o método Insert(). Se quiser realizar uma operação de inserção em um Collection em 10 segundos, você pode usar um Contexto com um tempo limite. Se a operação não for concluída dentro do tempo limite, o método retornará um erro.

client := mongo.Connect(context.TODO())
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client.Database("<db>").Collection("<collection>").Insert(ctx, bson.D{{"x",1}})

Se o contexto passado para uma operação não tiver um prazo, você poderá definir uma opção de Timeout em seu Client e a operação derivará a especificação de tempo limite dessa configuração. Para saber mais sobre como usar a configuração de tempo limite único, consulte oGuia de conexão .

O driver considera que um Contexto expirou se uma operação excede o tempo limite ou é cancelada. O driver verifica a expiração do contexto com o método Done().

As seções a seguir descrevem quando e como o driver verifica a expiração.

O driver pode bloquear uma chamada de método se não puder selecionar um servidor para uma operação.

Nesse cenário, o driver faz um loop até encontrar um servidor para usar na operação. Após cada iteração, o driver retorna um erro de tempo limite de seleção do servidor se o contexto expirou ou o processo de seleção demorou mais do que a configuração serverSelectionTimeoutMS.

Para saber mais sobre como o driver seleciona um servidor, consulte o Algoritmo de Seleção de Servidor.

O driver poderá bloquear uma chamada de método se não houver conexões disponíveis para check-out.

Depois de selecionar um servidor, o driver tenta verificar uma conexão no pool de conexões do servidor. Se o Contexto expirar ao verificar uma conexão, o método retornará um erro de tempo limite.

O driver pode bloquear uma chamada de método se tiver de criar uma nova conexão.

Quando o driver cria uma nova conexão para executar uma operação, o Context define um tempo limite para o processo de estabelecimento. O driver define o tempo limite para a expiração de contexto ou tempo limite de conexão, o que for menor.

O exemplo a seguir define o tempo limite da conexão como 1 segundo e o prazo final do contexto como 2 segundos. Como o tempo limite da conexão é menor, o processo de estabelecimento expira após 1 segundo.

opts := options.Client()
opts.SetConnectTimeout(1*time.Second)
client := mongo.Connect(context.TODO(), opts)
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
client.Database("<db>").Collection("<collection>").InsertOne(ctx, bson.D{{"x",1}})

Quando o driver recupera uma conexão para uma operação, ele define o prazo de leitura ou escrita do soquete para o prazo de contexto ou tempo limite do soquete, o que for mais curto.

Se você cancelar o contexto após a execução do método Read() ou Write(), mas antes de seu prazo final, o comportamento do driver será diferente de acordo com a versão.

O driver gera uma goroutine separada para detectar o cancelamento de contexto quando o método Read() ou Write() está em andamento. Se a goroutine detectar um cancelamento, ela fecha a conexão. O método Read() ou Write() pendente retorna um erro que o driver substitui pelo erro context.Canceled.

Importante

Em versões anteriores a 1.5.0, o driver não detecta o cancelamento de contexto e aguarda a devolução do método Read() ou Write().

← Stable API