Contexto
Nesta página
Visão geral
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}})
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 precisar criar uma nova conexão.
Quando o driver precisa criar 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 do contexto ou para o 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()
.