Contexto
Nesta página
Visão geral
O MongoDB Go Driver 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 .
Expiraçã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.
Seleção do Servidor
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.
Checkout de Conexão
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.
Estabelecimento de Conexão
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}})
Leitura e escrita de soquete
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()
.