카우치베이스 서버

Golang을 사용하여 카우치베이스에서 하위 문서 변형을 비동기적으로 수행하기

얼마 전까지만 해도 필자는 Go SDK가 포함된 Couchbase Server 하위 문서 API. 하위 문서 작업은 잠재적으로 방대한 NoSQL 문서의 일부를 변경하거나 액세스하려는 경우 매우 유용합니다. 하위 문서 작업은 네트워크 리소스를 절약하고 성능에 큰 도움이 됩니다.

제 동료가 제가 튜토리얼에서 설명한 방법과 유사하게 키별로 일괄적인 하위 문서 변경을 수행하는 방법에 대해 질문했습니다, Golang을 사용하여 한 번의 작업으로 키별로 여러 개의 카우치베이스 문서 가져오기. 짧은 대답은 한 번의 작업으로는 불가능하다는 것이지만, Golang은 매우 빠르고 훌륭하기 때문에 병렬로 작업을 수행하여 동일한 결과를 얻을 수 있습니다.

Go 프로그래밍 언어를 사용하여 문서 ID 목록을 기반으로 하위 문서 변경을 비동기적으로 수행하는 방법과 다음을 살펴보겠습니다. 카우치베이스.

우리가 달성하고자 하는 실제 시나리오를 생각해 봅시다. 초당 수천만 건의 요청을 수신하는 전문 네트워킹 웹사이트가 있다고 가정해 봅시다. 성능은 필수이므로 이러한 요청 중 일부를 최대한 일괄 처리하기로 결정합니다. 100명이 방금 프로필을 업데이트하여 자신의 기술 중 하나로 골랑을 포함시켰다고 가정해 봅시다. 이를 기술 목록 중 하나로 추가하고 싶습니다.

앞으로 저희는 모든 작업을 main.go 파일 어딘가에 $GOPATH 경로로 이동합니다. 이 파일을 열고 다음을 포함합니다:

지금까지의 내용을 분석해 보겠습니다.

고루틴과 병행하여 작업을 수행할 계획이므로 애플리케이션을 언제 종료해도 안전한지 알아야 합니다. 애플리케이션의 WaitGroup 를 사용하면 비동기 작업을 추적하고 작업이 모두 완료될 때까지 기다렸다가 계속할 수 있습니다. 고루틴으로 데이터를 처리할 것이므로 모든 고루틴이 동시에 사용하는 채널이 필요합니다. 각 고루틴은 각 고루틴이 worker 메서드를 사용합니다.

에서 메인 메서드에서 변형을 받을 모든 키를 선언하고 있습니다. 프로덕션 시나리오에서는 애플리케이션 비즈니스 로직이 이 키 목록을 집계할 것입니다.

또한 Couchbase와의 연결도 구축 중입니다.

기초가 마련되었으므로 이제 더 자세히 살펴 보겠습니다. 메인 메서드를 사용합니다.

바둑에서는 엄청나게 많은 양의 고루틴을 스핀업하여 병렬로 실행할 수 있습니다. 물론 스핀업할 수 있는 실제 개수는 하드웨어에 따라 다르지만 지금은 보수적으로 두 개로 가정해 보겠습니다. 모든 worker 를 시작하면 WaitGroup. 이러한 고루틴이 중지되면 WaitGroup 가 감소하여 결국 애플리케이션 차단을 해제하고 종료할 수 있습니다.

또한 문자열 데이터에 대한 채널을 추가한 것을 알 수 있습니다. 원하는 각 문서 ID가 채널에 추가되고 채널이 닫힙니다. 이렇게 하는 이유를 정의할 때 worker 로직.

위의 스니펫은 worker 메서드 로직. 함수가 종료되면 defer 메서드가 실행되면 WaitGroup.

worker 는 루프를 통해 영원히 실행됩니다. 각 루프 반복은 각 루프 반복에서 데이터 채널로 이동합니다. 그렇지 않은 경우 확인를 반환하면 채널이 비어 있으므로 루프를 종료해야 한다는 의미일 가능성이 높습니다. ID를 얻으면 해당 문서에서 변형을 수행하고 새 문자열을 기술 경로를 배열로 가정합니다. 문서 내에 배열이 존재하지 않으면 배열이 생성됩니다.

키가 존재하지 않는 등 어떤 이유로든 오류가 발생하면 오류가 발생했음을 인쇄합니다.

이 간단한 데모의 전체 코드는 다음과 같습니다:

다시 말하지만, 이러한 하위 문서 변경은 기술 배열을 고루틴을 통해 병렬로 처리할 수 있습니다. 고루틴을 사용하여 동시에 작업을 수행하는 방법에 대한 자세한 내용은 제가 이전에 작성한 이 튜토리얼의 제목을 참조하세요, 고루틴 및 채널을 사용한 동시 Golang 애플리케이션.

결론

방금 Couchbase와 Golang으로 하위 문서 변형을 수행하는 또 다른 데모를 보셨습니다. 이번에는 대량 연산자 중 하나를 사용하는 대신 병렬로 작업을 수행하는 방법을 살펴봤습니다. 병렬로 작업을 수행하면 키 목록에서 일괄 연산을 수행하는 것과 거의 동일한 성능을 얻을 수 있습니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 닉 라보이

닉 라보이는 최신 웹 및 모바일 개발 기술을 옹호하는 사람입니다. 그는 Java, JavaScript, Golang 및 Angular, NativeScript, Apache Cordova와 같은 다양한 프레임워크에 대한 경험이 있습니다. Nic은 웹 및 모바일 개발을 보다 쉽게 이해할 수 있도록 자신의 개발 경험에 대해 글을 쓰고 있습니다.

댓글 하나

  1. 안녕하세요 닉, 좋은 글입니다. 제 사용 사례는 대량 약 100개의 하위 문서문서 키 목록이 주어집니다. 기사에서 말씀하셨고 결론을 내렸듯이

    제 동료가 Golang을 사용하여 단일 작업에서 키별로 여러 개의 카우치베이스 문서 가져오기라는 제목의 튜토리얼에서 설명한 것과 유사하게 키별로 하위 문서를 대량으로 변경하는 방법을 묻는 질문이 있었습니다. 짧은 대답은 단일 작업으로는 불가능하다는 것이지만, Golang은 매우 빠르고 훌륭하기 때문에 병렬로 작업을 수행하여 동일한 결과를 얻을 수 있다는 것입니다.

    이번에는 일괄 연산자 중 하나를 사용하는 대신 병렬로 작업을 수행하는 방법을 살펴봤습니다. 병렬로 작업을 수행하면 키 목록에서 일괄 연산을 수행하는 것과 거의 동일한 성능을 얻을 수 있습니다.

    어차피 수백 번의 네트워크 호출을 수행하게 될 텐데 그러면 어떻게 효율적인지 확인하고 싶어요.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.