[이 블로그는 http://blog.grallandco.com]에서 신디케이트되었습니다.
소개
디자인
- 문서 버전을 새 문서에 복사합니다.
- 문서의 버전을 임베드된 문서 목록에 복사합니다.
- 임베디드 요소(또는 새 문서)로 변경된 속성 목록을 저장합니다.
- "델타" 저장
- ...
- 현재 버전은 키가 변경되지 않은 단순한 키/문서입니다.
- 버전은 문서의 사본이며 버전 번호가 키에 추가됩니다.
현재 버전 | mykey |
버전 1 | mykey::v1 |
버전 2 | mykey::v2 |
… | … |
이 접근 방식을 사용하면 키가 변경되지 않으므로 기존 애플리케이션은 항상 문서의 현재 버전을 사용합니다. 그러나 이 접근 방식은 기존 보기에서 색인될 새 문서를 생성합니다.
예를 들어, 맥주 샘플 애플리케이션에서 다음 보기는 맥주를 이름별로 나열하는 데 사용됩니다:
if(doc.type && doc.type == "beer") {
emit(doc.name);
}
}
보기 자체를 제외하고 기존 코드에 영향을 주지 않고 버전 관리를 '지원'하는 것은 매우 간단합니다. 새 보기는 문서의 현재 버전에 대해서만 키, 값을 방출해야 합니다. 이것이 새 보기 코드입니다:
if(doc.type && doc.type == "beer" && (meta.id).indexOf("::v") == -1 ) {
emit(doc.name);
}
}
버전 관리 구현
- 문서의 현재 버전 가져오기
- 버전 번호를 늘립니다(예: 각 문서의 버전 번호를 유지하는 다른 키를 사용).
- 새 키 "mykey::v1"을 사용하여 버전을 생성합니다.
- 문서 현재 버전 저장
if (obj != null) {
// 다음 버전 가져오기, 키 생성 또는 사용: mykey_version
long version = client.incr(key + "_version", 1, 1);
String keyForVersion = key + "::v" + version; // mykey::v1
시도 {
client.set(keyForVersion, obj).get();
} catch (Exception e) {
logger.severe("버전 "+ 버전 + " 키 "+ 키 +"에 대해 저장할 수 없습니다 - 오류:"+ e.getMessage() );
}
}
client.set(키, 값);
아주 간단하지 않나요?
응용 프로그램은 키를 사용하여 문서에 액세스 할 수 있지만 하나의 버전 또는 모든 버전 목록을 가져올 수도 있으므로 키를 만드는 것이 흥미로운 이유 중 하나입니다 (mykey_version)를 클릭하고 문서 및 관련 버전을 삭제하는 데에도 사용할 수 있습니다.
이전 댓글에 따르면 삭제 작업은 다음과 같습니다:
// 먼저 모든 버전을 삭제해야 합니다.
객체 vObject = this.get(key + "_version");
if (vObject != null) {
long biggerVersion = Long.parseLong((문자열) vObject);
시도 {
// 모든 버전 삭제
for (int i = 1; i <= biggerVersion; i++) {
문자열 versionKey = key + "::v" + i;
client.delete(versionKey).get();
}
// 카운터 삭제
client.delete(key + "_version").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
client.delete(키);
버전 관리 사용
CD 사용 방법 버전 관리
MVN 새로 설치
…
com.couchbase.howtos
카우치베이스-버전업 방법
1.0-스냅샷
카우치베이스
카우치베이스-클라이언트
1.1.8
…
애플리케이션 코딩
문서를 만들고 버전을 지정합니다:
uris.add(URI.create("http://127.0.0.1:8091/pools"));
CouchbaseClientWithVersioning 클라이언트 = null
시도 {
client = 새로운 CouchbaseClientWithVersioning(uris, "default", "");
문자열 key = "key-001";
client.set(key, "이것은 원래 버전입니다");
System.out.printf("원본 '%s' .n", client.get(key));
client.set(key, "이것은 새 버전입니다", true); // 새 버전을 생성합니다.
System.out.printf("현재 버전 '%s' .n", client.get(key));
System.out.printf("버전 1 '%s' .n", client.get(key, 1));
client.set(key, "이것은 다른 버전입니다", true); // 새 버전을 생성합니다.
System.out.printf("모든 버전 %s .n", client.getAllVersions(key));
client.deleteVersion(key, 1); // 새 버전을 생성합니다.
System.out.printf("모든 버전 %s(1버전 삭제 후).n", client.getAllVersions(key));
client.delete(key); // 새 버전 만들기
System.out.printf("모든 버전 %s(기본 키 삭제 후).n", client.getAllVersions(key));
} catch (Exception e) {
e.printStackTrace();
}
if (client !=null) {
client.shutdown();
}
간단히 설명합니다:
- 5번째 줄: 5번째 줄에서 카우치베이스클라이언트를 사용하면 애플리케이션은 확장된 카우치베이스클라이언트위드버저닝 클래스.
- 7줄: 새 항목 만들기
- 9줄: 새 버전 만들기, 부울 값을 "true"로 설정하면 문서의 버전이 강제로 생성됩니다.
- 애플리케이션은 특정 버전 가져오기(11줄), 모든 버전 가져오기(13줄), 특정 버전 삭제(14줄), 마지막으로 키 및 모든 버전 삭제(16줄)와 같은 다른 방법을 사용합니다.
client.setAutomaticVersionning(true);
이 접근 방식을 사용하면 최소한의 코드 변경으로 애플리케이션에 버전 관리를 제공할 수 있습니다. Beer 샘플 애플리케이션에서 테스트할 수 있으며, 위의 문서 작성자로 뷰를 변경하는 것을 잊지 마세요. 현재 버전의 문서입니다.
결론
이 특정 샘플 코드에서는 각 버전에 대해 문서 사본을 만드는 간단한 디자인으로 작업하고 있습니다. 이 접근 방식을 사용하면 JSON 문서뿐만 아니라 모든 값을 "무엇이든" 버전으로 만들 수 있다는 점이 흥미롭습니다. 앞서 말했듯이 이것은 가능한 접근 방식 중 하나이며 다른 디자인과 마찬가지로 애플리케이션이나 데이터베이스(이 경우 대부분의 데이터베이스)에 약간의 영향을 미칩니다:
- 키 및 문서 수 늘리기
- 예를 들어 문서를 업데이트할 때 애플리케이션이 현재 값을 가져오고, 버전을 만들고, 현재 버전을 저장해야 하는 등 작업 횟수가 두 배 이상 증가합니다.
- 새 버전 추가 및 버전 번호 증가 시 일관성 관리(새 버전 생성, 버전 및 카운터 삭제 시 오류 처리 필요....)
- 특정 버전 수로 제한합니다,
- replace() 작업의 버전 관리만 활성화합니다.
- JSON 문서에 버전에 대한 특정 속성 추가(예: 버전 날짜)
- ….
Couchbase 애플리케이션에서 버전 관리를 사용 중이라면 자유롭게 댓글을 달거나 사용 방법을 설명하는 작은 글을 작성해 주세요.