Docs Menu
Docs Home
/ / /
Go 드라이버

FAQ

이 페이지의 내용

  • MongoDB에 연결하는 동안 오류가 발생하는 이유는 무엇인가요?
  • Go 드라이버에서 연결 풀링은 어떻게 작동하나요?
  • "WriteNull은 요소 또는 값에 위치하지만 최상위에 위치하는 경우에만 쓸 수 있습니다" 오류를 수정하려면 어떻게 해야 합니까?
  • BSON 문서를 JSON으로 어떻게 변환하나요?

이 페이지에는 자주 묻는 질문(FAQ)과 해당 답변이 포함되어 있습니다.

이 페이지에서 문제에 대한 답변 을 찾을 수 없는 경우 문제 및 도움말 페이지에서 다음 단계와 추가 리소스를 참조하세요.

MongoDB deployment에 연결하는 데 문제가 있는 경우 연결 문제 해결 가이드에서 가능한 해결 방법을 참조하세요.

모든 Client 인스턴스 에는 MongoDB 토폴로지 의 각 서버 에 대한 내장 연결 풀 . 연결 풀은 필요에 따라 소켓을 열어 애플리케이션 에서 동시 MongoDB 작업 또는 goroutine 을 지원 합니다.

각 연결 풀의 최대 크기는 maxPoolSize 옵션으로 설정되며 기본값은 100입니다. 서버에 대한 사용 중인 연결 수가 maxPoolSize 값에 도달하면 해당 서버에 대한 다음 요청은 연결이 가능해질 때까지 대기합니다.

Client 인스턴스는 MongoDB 토폴로지에서 서버당 두 개의 추가 소켓을 열어 서버 상태를 모니터링합니다.

예를 들어, 3노드 복제본 세트에 연결된 클라이언트는 6개의 모니터링 소켓을 엽니다. 또한 각 서버에서 응용 프로그램의 동시 작업을 지원하는 데 필요한 소켓을 최대 maxPoolSize 값까지 엽니다. maxPoolSize(이)가 100(이)가 되고 애플리케이션이 프라이머리(기본값)만 사용하는 경우 프라이머리 연결 풀만 커지고 최대 총연결이 106(이)가 될 수 있습니다. 애플리케이션이 읽기 설정을 사용하여 세컨더리 노드를 쿼리하는 경우 해당 풀도 증가하고 총연결이306(이)가 될 수 있습니다.

또한 연결 풀에는 속도 제한이 있으므로 각 연결 풀은 항상 최대 maxConnecting 연결 값만 병렬로 생성할 수 있습니다. 다음과 같은 경우 추가 goroutine은 대기를 중지합니다.

  • 기존 goroutine 중 하나가 연결 생성을 완료하거나 기존 연결이 풀로 다시 확인됩니다.

  • 연결 생성에 대한 속도 제한으로 인해 기존 연결을 재사용하는 드라이버의 기능이 향상됩니다.

minPoolSize 옵션(기본값 0)을 사용하여 각 서버에 대한 최소 동시 연결 수를 설정할 수 있습니다. minPoolSize를 설정하면 이 소켓 수로 연결 풀이 초기화됩니다. 네트워크 오류로 인해 소켓이 닫혀 총 소켓 수(사용 중 및 유휴 상태 모두)가 최솟값 아래로 떨어지면 최솟값에 도달할 때까지 더 많은 소켓이 열립니다.

연결이 제거되기 전에 풀에서 유휴 상태로 유지될 수 있는 최대 시간(밀리초)을 설정하고 maxIdleTimeMS 옵션(기본값은 None (제한 없음))으로 대체될 수 있습니다.

Client에 대한 다음 기본 구성은 대부분의 애플리케이션에서 작동합니다.

client := mongo.Connect(context.TODO(), "<connection string>")

각 프로세스에 대해 한 번씩 클라이언트를 생성하고 모든 작업에 재사용합니다. 각 요청에 대해 새 클라이언트를 생성하는 것은 흔한 실수이며 이는 매우 비효율적입니다.

한 프로세스 내에서 많은 수의 동시 MongoDB 작업을 지원하려면 maxPoolSize(을)를 늘리면 됩니다. 풀이 최대 크기에 도달하면 추가 작업은 소켓을 사용할 수 있을 때까지 대기합니다.

드라이버는 소켓이 사용 가능해질 때까지 대기할 수 있는 작업 수를 제한하지 않으며 부하 급증 시 해당 풀의 크기를 대기열로 제한으로 제한하는 것은 애플리케이션의 책임입니다. waitQueueTimeoutMS 옵션을 정의하지 않는 한 작업은 원하는 시간 동안 대기할 수 있습니다.

소켓에 대해 waitQueueTimeoutMS에서 정의한 시간보다 오래 대기하는 작업은 연결 오류를 발생시킵니다. 모든 작업을 완료하는 것보다 부하가 급증하는 동안 작업 기간을 제한하는 것이 더 중요한 경우 이 옵션을 사용하세요.

Client.Disconnect()가 goroutine에 의해 호출되면 드라이버는 모든 유휴 소켓을 닫고 풀로 반환될 때 사용 중인 모든 소켓을 닫습니다.

bson.Marshal() 메서드에는 BSON 문서로 디코딩될 수 있는 매개변수(예: bson.D 유형)가 필요합니다. 이 오류는 BSON 문서 이외 의 것을 bson.Marshal() 에 전달할 때 발생합니다.

WriteNull 오류는 null(을)를 bson.Marshal() 에 전달할 때 발생합니다. 유사한 오류가 발생할 수 있는 상황은 다음과 같습니다:

  • 문자열을 bson.Marshal()에 전달하면 WriteString 오류가 발생합니다.

  • 부울을 bson.Marshal()에 전달하면 WriteBoolean 오류가 발생합니다.

  • bson.Marshal()에 정수를 전달하면 WriteInt32 오류가 발생합니다.

이 오류는 내부적으로 bson.Marshal() 메서드를 사용하는 CRUD 작업을 수행하거나 bson.Marshal() 를 직접 호출하여 데이터를 인코딩할 때 발생할 수 있습니다.

다음 코드에서는 드라이버가 FindOneAndUpdate() 작업 중에 nullsortOrder를 BSON으로 인코딩할 수 없기 때문에 WriteNull 오류가 발생합니다.

var sortOrder bson.D
opts := options.FindOneAndUpdate().SetSort(sortOrder)
updateDocument := bson.D{{"$inc", bson.D{{"counter", 1}}}}
result := coll.FindOneAndUpdate(context.TODO(), bson.D{}, updateDocument, opts)
if err := result.Err(); err != nil {
panic(err)
}

다음 코드에서는 드라이버가 BSON으로 변환할 수 있도록 sortOrder 변수를 bson.D 형식으로 올바르게 초기화하는 방법을 보여 줍니다.

sortOrder := bson.D{}

드라이버는 BSON 문서를 JSON으로 변환하는 데 사용할 수 있는 다양한 마셜러 메서드(예: MarshalExtJSON() 메서드)를 제공합니다. 읽을 수 있는 형식의 JSON 인코딩을 보려면 언마셜러 메서드 또는 문자열 유형 변환을 사용하여 JSON 바이트 형식을 구문 분석해야 합니다.

다음 코드는 MarshalExtJSON() 메서드를 사용하여 BSON 문서를 JSON으로 변환한 다음 문자열 유형 캐스팅을 사용하여 JSON 바이트 배열을 구문 분석하고 인쇄합니다.

bsonDocument := bson.D{{"hello", "world"}}
jsonBytes, err := bson.MarshalExtJSON(bsonDocument, true, false)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
{"hello":"world"}

BSON과 Go 유형 간의 변환에 대한 자세한 내용은 BSON과 함께 작업 가이드를 참조하세요.

돌아가기

지리 공간 데이터