오늘 Couchbase .NET SDK 버전 2.2.0을 출시합니다. 이번 릴리스의 주요 초점은 오늘 함께 릴리스된 Couchbase Server 4.0 GA와의 기능 호환성입니다! 이번 릴리스의 핵심 기능은 다음과 같습니다:
- N1QL 지원
- 다차원 스케일링(MDS) 지원
- 향상된 내구성
- GEO 공간 뷰
2.2.0 SDK에는 이러한 주요 기능과 함께 몇 가지 버그 수정 및 개선 사항도 포함되어 있습니다. 이전 버전의 SDK를 사용 중이라면 이 최신 버전으로 업그레이드할 것을 강력히 권장합니다.
전체 릴리스 노트는 다음과 같습니다. 여기.
N1QL: JSON을 위한 새로운 SQL과 유사한 쿼리 언어
의심할 여지 없이 Couchbase Server 4.0에서 가장 중요한 기능은 문서에 대한 새로운 SQL과 같은 쿼리 언어인 N1QL로 JSON 문서를 쿼리하는 기능을 완벽하게 지원한다는 것입니다. Couchbase .NET SDK 버전 2.2.0은 새로운 클라이언트 API를 통해 N1QL을 완벽하게 지원합니다.
쿼리 요청 클래스
QueryRequest 클래스는 카우치베이스 서버에 대한 N1QL 쿼리 요청을 나타냅니다. 포트 8093을 통해 N1QL REST API를 캡슐화하며 쿼리 실행을 위한 유형 안전 인터페이스를 제공합니다. 예를 들어, CouchbaseBucket 클래스에 내장된 내부 쿼리 클라이언트와 함께 REST API의 많은 배관 및 복잡성을 처리합니다:
- 로직 일시적 및 복구 가능한 오류 재시도
- 클러스터 전체에 걸쳐 쿼리의 균일한 분포
- 준비된 문을 처리하는 로직
- 우리 캐싱
- 쿼리 결과를 POCO에 매핑하기
- 등
QueryRequest 클래스는 쿼리 결과의 실행, 오류 처리 및 데이터 매핑에서 실제 N1QL 문을 분리합니다. 다음은 QueryRequest를 사용하여 나중에 CouchbaseBucket에 대해 실행될 요청을 빌드하는 예제입니다:
1 2 3 4 5 |
var 쿼리 요청 = new 쿼리 요청() .성명서("SELECT * FROM `beer-sample` LIMIT $1") .위치 매개변수 추가(10) .시간 초과(new TimeSpan(0, 0, 0, 500)); |
먼저 QueryRequest 객체를 생성하고 여기에 N1QL 문을 전달합니다. 그런 다음 위치 매개변수를 추가합니다(참고 이름 매개변수도 지원됨). 마지막으로 500밀리초의 사용자 지정 시간 제한으로 전역 ClientConfiguration.QueryRequestTimeout 값을 재정의합니다.
QueryRequest가 생성되면 Query 메서드를 사용하여 CouchbaseBucket에 대해 실행할 수 있습니다:
1 2 3 4 5 6 7 8 9 |
var 결과 = 기다림 버킷.QueryAsync<동적>(쿼리 요청); 만약(결과.성공) { foreach(var doc in 결과.행) { 콘솔.라이트라인(doc); } } |
그게 다입니다! 새로운 API에는 다음과 같은 메서드와 속성이 QueryRequest에 의해 노출됩니다:
방법 | 설명 | 선택 사항 |
---|---|---|
성명서 | 실행할 N1QL 문을 설정합니다. | false |
준비됨 | 주어진 쿼리 플랜을 사용하여 최적화된 방식으로 실행되도록 N1QL 문을 설정합니다. | true |
시간 초과 | 요청에 소요되는 최대 시간을 설정합니다. | true |
읽기 전용 | GET 요청인 경우 항상 참이고 그렇지 않으면 거짓입니다. | true |
메트릭 | 쿼리 결과와 함께 메트릭을 반환하도록 지정합니다. | true |
추가 이름 매개변수 | 명명된 매개 변수를 문 또는 준비된 문에 매개 변수에 추가합니다. | true |
위치 매개변수 추가 | 문 또는 준비된 문에 매개 변수에 위치 매개 변수를 추가합니다. | true |
스캔 일관성 | 인덱스 스캔에 대한 일관성 보장/제약 조건을 지정합니다. | true |
AddHoc | false로 설정하면 클라이언트는 원시 쿼리 대신 쿼리 계획을 준비한 다음 실행하는 등 서버 기능에 따라 투명하게 최적화를 수행하려고 시도합니다. | true |
이것이 실용적이고 완전히 지원되는 매개변수입니다. 그 외에도 압축, 형식 및 인코딩에 대한 매개변수/메서드가 있지만 현재로서는 사용하지 않는 것이 좋습니다. 또한 AtPlus 및 StatementPlus의 ScanConsistency는 현재 지원되지 않으며 전달될 경우 NotSupportedException이 발생합니다.
QueryResult 클래스
요청이 서버로 전송되어 처리되면 응답이 JSON 문서 형태로 클라이언트에 다시 반환됩니다. 클라이언트는 응답을 받아 QueryRequest 클래스에 매핑합니다. 또한 클라이언트는 응답의 상태 코드(N1QL 및 HTTP 모두)를 분석하여 요청을 다시 시도할지 여부를 결정합니다. 일반적으로 HTTP 400 오류는 클라이언트 문제를 나타내므로 재시도하지 않고 호출자에게 다시 반환됩니다.
QueryRequest 클래스의 주목할 만한 프로퍼티와 메서드는 다음과 같습니다:
방법 | 설명 |
---|---|
성공 | 쿼리가 성공하면 true입니다. |
메시지 | 쿼리 엔진 또는 클라이언트에서 반환하는 선택적 메시지 |
예외 | 성공이 거짓이고 내부적으로 예외가 감지된 경우 이 필드에 예외가 포함됩니다. |
RequestId | 요청 식별자를 가져옵니다. |
ClientContextId | 요청의 클라이언트 컨텍스트ID(제공된 경우)를 가져옵니다. 디버깅에 사용됩니다. |
서명 | 결과의 스키마를 가져옵니다. 쿼리가 성공적으로 완료된 경우에만 표시됩니다. |
행 | 쿼리에서 반환된 모든 객체의 목록을 가져옵니다. 객체는 모든 JSON 값일 수 있습니다. |
상태 | 요청의 상태를 가져옵니다. 가능한 값은 성공, 실행 중, 오류, 완료, 중지, 시간 초과, 치명적입니다. |
오류 | 0개 이상의 오류 개체 목록을 가져옵니다. 요청을 처리하는 동안 오류가 발생한 경우 이 목록에 오류 개체로 표시됩니다. |
경고 | 0개 이상의 경고 개체 목록을 가져옵니다. 요청을 처리하는 동안 경고가 발생한 경우 이 목록에 경고 개체로 표시됩니다. |
메트릭 | 요청에 대한 메트릭이 포함된 객체를 가져옵니다. |
HttpStatusCode | 요청에 대한 HTTP 상태 코드를 가져옵니다. |
성공 필드는 일반적으로 쿼리 요청의 성공/실패를 나타내는 데 사용되며, 실패한 경우 오류, 경고, 상태 및 HttpStatusCode 필드를 사용하여 오류/문제를 진단하여 해결할 수 있습니다.
준비된 명령문 사용
서버에서 실행되는 모든 문에는 시간과 리소스가 소요되는 관련 쿼리 계획이 생성되어야 합니다. 준비된 문을 사용하면 생성된 쿼리 계획을 반복해서 재사용할 수 있어 전반적인 성능과 서버 상태를 개선할 수 있습니다. 준비된 문을 사용하려면 AdHoc 매개 변수를 false로 설정해야 합니다:
1 2 3 4 5 6 |
var 쿼리 요청 = new 쿼리 요청() .성명서("SELECT * FROM `beer-sample` LIMIT 1") .애드혹(false); var 결과 = 버킷.쿼리<동적>(쿼리 요청); |
SDK는 이 명세서 및 향후 모든 요청에 대해 준비된 명세서의 준비, 캐싱 및 재사용을 처리합니다.
다차원 스케일링
또한, 다차원 확장이라고도 하는 다차원 확장은 클러스터의 특정 노드에서 실행할 서비스를 할당할 수 있는 Couchbase Server 4.0의 새로운 기능입니다. 예를 들어, 4노드 클러스터가 있는 경우 한 노드는 쿼리 전용, 한 노드는 인덱싱 전용, 두 노드는 데이터 서비스 전용으로 지정하거나 특정 노드에서 일부 서비스를 조합하여 실행할 수 있습니다. SDK 자체는 어떤 노드가 각 서비스를 지원하는지 인식하고 클러스터의 올바른 노드로 쿼리와 키를 "자동으로" 라우팅합니다.
향상된 내구성
내구성 강화는 내구성 제약 조건을 적용하는 새로운 방법입니다. 내구성 제약 조건은 키가 "n"개의 복제본에 복제 및/또는 유지되도록 하기 위해 돌연변이에 설정하는 제약 조건입니다. 기존의 '관찰' 기반 내구성 제약 조건과 큰 차이점은 향상된 내구성에서는 복제본 시퀀스 번호를 사용하여 키가 원하는 기능을 달성했는지 확인하는 반면, '관찰'에서는 키 자체의 복제본 상태를 비교한다는 점입니다.
내구성 향상은 기존 키/값 API를 변경하는 것이 아니라 단순히 구성을 변경하는 것이며, 나머지는 SDK의 내부 API에 의해 '내부적으로' 수행됩니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
var 구성 = new 클라이언트 구성 { 버킷 구성 = new 사전<문자열, 버킷 구성> { { "default", new 버킷 구성 { 사용 내구성 향상 = true } } } }; 사용 (var 클러스터 = new 클러스터(구성)) { 사용 (var 버킷 = 클러스터.OpenBucket()) { var 결과 = 버킷.삽입(키, "foo", ReplicateTo.Two, PersistTo.Two); 만약(결과.성공) { //성공하면 작업 수행 } } } |
여기서 핵심은 '기본' 버킷에 대한 BucketConfiguration에서 UseEnhancedDurability가 true로 설정되었다는 것입니다. 외부 지속성 API는 동일하며, 작업이 반환되기 전에 충족되어야 하는 원하는 지속성을 가진 키 및 값과 함께 PersistTo 및 ReplicateTo 필드가 전달됩니다.
GEO 공간 뷰
기존 카우치베이스 서버에 새롭게 추가된 것은 GEO 공간 뷰 지원입니다. GEO 공간 보기는 지리적 범위를 쿼리할 수 있는 JavaScript(축소 기능은 지원되지 않음)를 사용하여 맵 함수를 정의하여 만들 수 있습니다.
다음은 공간 뷰의 예입니다:
1 2 3 4 5 6 |
함수 (doc) { 만약 (doc.유형 == "양조장" && doc.geo.lon && doc.geo.위도) { emit({ "type": "포인트", "좌표": [doc.geo.lon, doc.geo.위도]}, null); } } |
공간 보기를 사용하기 위한 SDK API는 보기 API와 매우 유사하지만 특수한 SpatialViewQuery 클래스를 사용하여 객체를 구성한 다음 실행을 위해 CouchbaseBucket 클래스에 제출합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var 쿼리 = new 스페이셜뷰 쿼리().에서("beer_ext_spatial", "points") .Stale(StaleState.False) .StartRange(-10.37109375, 33.578014746143985) .EndRange(43.76953125, 71.9653876991313) .연결 시간 초과(60000) .제한(1) .건너뛰기(0); var 결과 = 버킷.쿼리<동적>(쿼리); 만약(결과.성공) { foreach(var 행 in 결과.행) { 콘솔.라이트라인(행); } } |
공간 뷰 작성에 대해 자세히 알아볼 수 있습니다. 여기.
받는 방법
SDK는 NuGet을 통해 직접 다운로드하거나 Github 리포지토리를 복제하여 가져와서 사용할 수 있습니다: