Context
개요
MongoDB Go 드라이버는 컨텍스트 패키지 를 사용합니다.애플리케이션이 모든 차단 메서드 호출에 대해 시간 초과 및 취소 신호를 보낼 수 있도록 Go의 표준 라이브러리에서 제공합니다. 차단 메서드는 작업을 진행하기 위해 네트워크 입력 또는 출력과 같은 외부 이벤트에 의존합니다.
고(Go) 드라이버의 차단 메서드의 예로는 Insert()
메서드가 있습니다. 10초 안으로 Collection
에 대해 삽입 작업을 수행하려는 경우 시간 제한이 있는 컨텍스트(Context)를 사용할 수 있습니다. 제한 시간 내에 작업이 완료되지 않으면 메서드는 오류를 반환합니다.
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}})
작업에 전달된 컨텍스트에 기한이 없는 경우 Client
에 Timeout
옵션을 설정하다 하면 작업이 이 설정에서 시간 초과 사양을 파생합니다. 단일 시간 제한 설정 사용에 대한 학습 내용은 연결 가이드를 참조하세요.
만료
드라이버는 작업이 시간 초과를 초과하거나 취소되면 컨텍스트가 만료된 것으로 간주합니다. 드라이버가 Done()
메서드를 사용하여 컨텍스트 만료를 확인합니다.
다음 섹션에서는 드라이버가 만료 여부를 확인하는 시기와 방법을 설명합니다.
서버 선택
드라이버가 작업할 서버를 선택할 수 없는 경우 메서드 호출을 차단할 수 있습니다.
이 시나리오에서 드라이버는 작업에 사용할 서버를 찾을 때까지 루프를 반복합니다. 각 반복 후 컨텍스트가 만료되었거나 선택 프로세스가 serverSelectionTimeoutMS
설정보다 오래 걸린 경우 드라이버는 서버 선택 시간 초과 오류를 반환합니다.
드라이버가 서버를 선택하는 방법에 관한 자세한 내용은 서버 선택 알고리즘항목을 참조하세요.
연결 확인
확인할 수 있는 연결이 없으면 드라이버가 메서드 호출을 차단할 수 있습니다.
서버를 선택한 후 드라이버는 서버의 연결 풀에서 연결 확인을 시도합니다. 연결을 체크아웃하는 동안 컨텍스트가 만료되면 메서드는 시간 초과 오류를 반환합니다.
연결 설정
드라이버는 새 연결을 생성해야 하는 경우 메서드 호출을 차단할 수 있습니다.
드라이버가 작업을 수행하기 위해 새 연결을 만들 때 컨텍스트는 설정 프로세스에 대한 시간 초과를 설정합니다. 드라이버는 시간 초과를 컨텍스트 만료 또는 연결 시간 초과 중 더 짧은 것으로 설정합니다.
다음 예시에서는 연결 제한 시간을 1초로 설정하고 컨텍스트 기한을 2초로 설정합니다. 연결 제한 시간이 더 짧기 때문에 설정 프로세스는 1초 후에 만료됩니다.
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}})
소켓 읽기 및 쓰기
드라이버가 작업에 대한 연결을 검색할 때 소켓의 읽기 또는 쓰기 기한을 컨텍스트 기한 또는 소켓 시간 초과 중 더 짧은 것으로 설정합니다.
Read()
또는 Write()
메서드를 실행한 후 기한 전에 컨텍스트를 취소하는 경우 드라이버의 동작은 버전에 따라 달라집니다.
드라이버는 Read()
또는 Write()
메서드가 진행 중일 때 컨텍스트 취소를 수신하기 위해 별도의 goroutine을 생성합니다. goroutine이 취소를 탐지하면 연결을 닫습니다. 보류 중인 Read()
또는 Write()
메서드는 드라이버가 context.Canceled
오류로 덮어쓰는 오류를 반환합니다.
중요
1.5.0 이전 버전에서는 드라이버가 컨텍스트 취소를 감지하지 못하고 Read()
또는 Write()
메서드가 반환될 때까지 기다립니다.