내가 배우는 내용 카우치베이스 는 합리적인 기본값을 제공하는 것을 목표로 하지만, 절충점을 만들 수 있는 옵션도 제공합니다. 이 블로그 게시물에서 집중적으로 다룰 절충안은 N1QL 쿼리에 대한 스캔 일관성입니다.

Couchbase 4.5는 다음과 같은 새로운 기능을 도입했습니다. 스캔 일관성 옵션: AtPlus. 기존 옵션과 합쳐져 총 세 가지가 됩니다:
-
NotBounded(기본값)
-
AtPlus(카우치베이스 서버 4.5의 새로운 기능)
-
요청 플러스
이 블로그 게시물에서는 NotBounded와 RequestPlus를 검토하고 AtPlus를 소개합니다. 또한 세 가지를 모두 직접 사용해 볼 수 있는 코드 샘플도 제공할 것입니다.
제한 없음
이것이 기본 동작입니다.
"경계 없음" 스캔 일관성을 사용하는 N1QL 쿼리는 쿼리를 실행하고 결과를 반환하기 전에 인덱스 업데이트가 완료될 때까지 기다리지 않는다는 의미입니다. 버킷에 문서 A,B,C가 있다고 가정해 보겠습니다. 쿼리 시에는 A와 B만 색인됩니다. Not Bounded를 사용하면 문서 A와 B만 반환됩니다.
쿼리가 인덱싱을 기다리지 않으므로 성능에 가장 적합한 옵션입니다. 문서 C는 색인되면 표시됩니다. 오래 걸리지는 않지만, 예를 들어 방금 C를 만든 다음 바로 전체 문서 목록을 쿼리하는 경우 C가 표시되지 않을 수 있습니다. 예를 들어 여행 샘플
버킷:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
비공개 정적 void NotBoundedExample() { 콘솔.WriteLine("========= 비바운드(기본값)"); // 현재 카운트 가져오기 var 결과1 = _버킷.쿼리("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'") .행.먼저(); 콘솔.WriteLine($"초기 카운트: {result1.airportCount}"); // 새 공항 삽입 var doc = new 문서 { Id = "ScanConsistency::airport::" + _random.다음(10000), 콘텐츠 = new { 유형 = "공항" } }; _버킷.삽입(doc); // 카운트 다시 가져오기 var result2 = _버킷.쿼리("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'") .행.먼저(); 콘솔.WriteLine($"삽입 후 카운트: {result2.airportCount}"); // 몇 초 기다렸다가 카운트를 다시 가져옵니다. 콘솔.쓰기("5초 동안 기다리는 중..."); 스레드.수면(5000); var 결과3 = _버킷.쿼리("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'") .행.먼저(); 콘솔.WriteLine($"대기 후 카운트: {result3.airportCount}"); } |
이 코드를 실행할 때 예상되는 것은 다음과 같습니다:
-
초기 카운트: N
-
삽입 후 계산합니다: N
(스틸) -
대기 중
-
기다린 후 계산합니다: N+1
대기 시간을 5초로 설정했는데, 이는 아마도 지나친 설정일 수 있습니다. 저는 데모 목적으로 Thread.Sleep을 사용했지만 실제 앱에는 어색한 방식입니다. 그래서 RequestPlus를 소개합니다.
요청 플러스
이 스캔 일관성 옵션은 경계 없음과 거의 정반대의 기능을 제공합니다. 쿼리를 실행하기 전에 모든 문서 변경 및 인덱스 업데이트(쿼리가 실행될 때까지)가 처리될 때까지 기다립니다.
다음은 요청 플러스를 사용할 때의 간단한 이벤트 시퀀스 예시입니다.
-
문서 C가 생성됩니다.
-
모든 문서를 가져오기 위한 N1QL 쿼리가 실행됩니다(A,B,C 모두 버킷에 존재).
-
하나 이상의 문서를 색인해야 하므로 N1QL 쿼리가 보류됩니다(문서 C).
-
색인 프로세스가 완료되었습니다. 이제 문서 C가 색인되었습니다.
-
N1QL 쿼리가 실행되어 A,B,C를 반환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
비공개 정적 void 요청 플러스 예제() { 콘솔.WriteLine("========= RequestPlus"); // 현재 카운트 가져오기 var 결과1 = _버킷.쿼리("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'") .행.먼저(); 콘솔.WriteLine($"초기 카운트: {result1.airportCount}"); // 새 공항 삽입 var doc = new 문서 { Id = "ScanConsistency::airport::" + _random.다음(10000), 콘텐츠 = new { 유형 = "공항" } }; _버킷.삽입(doc); // 카운트 다시 가져오기 var 요청 = 쿼리 요청.만들기("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'"); 요청.스캔 일관성(스캔 일관성.요청 플러스); var result2 = _버킷.쿼리(요청).행.먼저(); 콘솔.WriteLine($"요청 플러스로 삽입 후 카운트: {result2.airportCount}"); } |
이렇게 하면 성능이 저하되는 대신 쿼리 결과의 완전성을 확보할 수 있습니다. 경우에 따라서는 쿼리 결과가 완성될 때까지 모든 것 를 색인화할 수 있습니다. 그리고 AtPlus를 소개합니다.
AtPlus(Couchbase 4.5의 새로운 기능)
이 스캔 일관성 옵션은 요청 플러스와 바운딩되지 않음 사이의 중간 지점을 제공합니다. 이것은 또한 Couchbase 4.5의 새로운 스캔 일관성 옵션.
AtPlus를 사용하면 코드에서 조금 더 많은 작업을 수행해야 하지만 그 대가로 RequestPlus를 사용하는 것보다 더 나은 성능을 얻을 수 있습니다. 전체 색인(여러 문서일 수 있음)이 완료될 때까지 기다리는 대신, 쿼리를 실행하기 전에 지정한 문서가 색인될 때까지 기다립니다. 이를 "읽기 자체 쓰기" 또는 RYOW라고도 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
비공개 정적 void AtPlus예제() { 콘솔.WriteLine("========= AtPlus"); // 현재 카운트 가져오기 var 결과1 = _버킷.쿼리("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'") .행.먼저(); 콘솔.WriteLine($"초기 카운트: {result1.airportCount}"); // 새 공항 삽입 var doc = new 문서 { Id = "ScanConsistency::airport::" + _random.다음(10000), 콘텐츠 = new { 유형 = "공항" } }; var 삽입 결과 = _버킷.삽입(doc); // 카운트 다시 가져오기 var 상태 = 변이 상태.에서(삽입 결과.문서); var 요청 = new 쿼리 요청("SELECT COUNT(1) as airportCount FROM `travel-sample` WHERE type='airport'"); var t = 요청.ConsistentWith(상태); var result2 = _버킷.쿼리(t).행.먼저(); 콘솔.WriteLine($"AtPlus로 삽입 후 카운트: {result2.airportCount}"); } |
이 예제에서 N1QL 쿼리는 새 문서가 색인될 때까지만 대기합니다. 다른 어떤 것도 기다리지 않습니다. 대용량 시스템에서는 이렇게 하면 성능 향상과 결과의 완전성 간에 좋은 균형을 이룰 수 있습니다.
이 게시물을 작성하는 시점에서는 다음과 같이 설정할 때 UseEnhancedDurability를 명시적으로 true로 설정해야 합니다. 클라이언트 구성
:
1 2 3 4 5 6 7 8 |
구성.버킷 구성 = new 사전 { { "travel-sample", new 버킷 구성 { 사용 내구성 향상 = true } } }; |
결론
N1QL에는 속도와 완성도의 스펙트럼이 있습니다. Couchbase Server 4.5에서는 이제 세 가지 옵션이 제공됩니다. 원시 속도를 위한 NotBounded, 현재까지의 완성도를 위한 RequestPlus, 그리고 그 중간에 위치한 AtPlus가 있습니다.
다음을 수행할 수 있습니다. 이 블로그 게시물의 전체 소스 코드를 깃허브에서 다운로드하세요..
댓글을 남겨 주세요, 트위터에서 나를 핑하기를 참조하거나 이메일(matthew.groves AT couchbase DOT com)로 문의하세요.