방법 : Couchbase로 문서 버전 관리 구현하기

[이 블로그는 http://blog.grallandco.com]에서 신디케이트되었습니다.

소개

개발자들은 종종 Couchbase 2.0으로 문서를 "버전 관리"하는 방법을 묻습니다. 짧은 대답은 클라이언트와 서버가 그러한 기능을 노출하지는 않지만 구현하기는 매우 쉽다는 것입니다.
이 글에서는 기본적인 접근 방식을 사용하며, 비즈니스 요구 사항에 따라 확장할 수 있습니다.

디자인

가장 먼저 해야 할 일은 문서의 버전을 '저장/정리'하는 방법을 선택하는 것입니다. 이를 위해 다양한 디자인이 있습니다:
  • 문서 버전을 새 문서에 복사합니다.
  • 문서의 버전을 임베드된 문서 목록에 복사합니다.
  • 임베디드 요소(또는 새 문서)로 변경된 속성 목록을 저장합니다.
  • "델타" 저장
  • ...
애플리케이션 요구 사항(비즈니스 로직, 데이터 세트의 크기 등)에 따라 디자인을 선택해야 합니다. 이 문서에서는 가장 간단한 접근 방식 중 하나를 사용하겠습니다. 각 버전에 대해 다음과 같은 키 규칙을 사용하여 새 문서를 만들어 보겠습니다:
  1. 현재 버전은 키가 변경되지 않은 단순한 키/문서입니다.
  2. 버전은 문서의 사본이며 버전 번호가 키에 추가됩니다.
이렇게 생겼습니다:
현재 버전   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);
}
}
이 변경으로 이 보기를 사용 중인 기존 애플리케이션은 동일한 동작으로 계속 작동합니다.

버전 관리 구현

이 설계에 따라 애플리케이션에서 문서 버전을 변경해야 할 때 다음과 같은 로직이 발생해야 합니다:
  1. 문서의 현재 버전 가져오기
  2. 버전 번호를 늘립니다(예: 각 문서의 버전 번호를 유지하는 다른 키를 사용).
  3. 새 키 "mykey::v1"을 사용하여 버전을 생성합니다.
  4. 문서 현재 버전 저장
Java로 코드를 살펴봅시다.
  객체 객체 = client.get(key);
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)를 클릭하고 문서 및 관련 버전을 삭제하는 데에도 사용할 수 있습니다.

이전 댓글에 따르면 삭제 작업은 다음과 같습니다:

  객체 객체 = client.get(key);
// 먼저 모든 버전을 삭제해야 합니다.
객체 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(키);

 

버전 관리 사용

예를 들어, 저는 GitHub에서 사용할 수 있는 작은 라이브러리를 만들었습니다. https://github.com/tgrall/couchbase-how-to-versioning이 라이브러리는 Couchbase 클라이언트를 확장하고 설정, 바꾸기 및 삭제와 같은 일부 작업을 재정의합니다. (기본값: TLL 없음, 내구성 없음) 앞서 말했듯이 이것은 단지 예시일 뿐입니다.
빌드 및 설치 
git clone https://github.com/tgrall/couchbase-how-to-versioning.git
CD 사용 방법 버전 관리
MVN 새로 설치
그런 다음 이 라이브러리를 프로젝트에 Couchbase Java Client 외에 추가합니다(예: pom.xml).

com.couchbase.howtos
카우치베이스-버전업 방법
1.0-스냅샷

카우치베이스
카우치베이스-클라이언트
1.1.8

애플리케이션 코딩

문서를 만들고 버전을 지정합니다:

 목록 uris = 새 LinkedList();
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줄)와 같은 다른 방법을 사용합니다.
따라서 이 접근 방식을 사용하면 개발자는 집합 연산에 부울 매개변수를 추가해야 하므로 버전을 생성할 시기를 명시적으로 제어할 수 있습니다. 이 작은 샘플 라이브러리에서는 자동 버전 관리를 수행할 수도 있습니다. 이 경우 모든 set 및 replace 호출이 버전을 생성하므로 개발자는 setAutoVersioning(true) 메서드를 호출하기만 하면 됩니다. 다음과 같이 말이죠:
    client = 새로운 CouchbaseClientWithVersioning(uris, "default", "");
client.setAutomaticVersionning(true);

 

이 접근 방식을 사용하면 최소한의 코드 변경으로 애플리케이션에 버전 관리를 제공할 수 있습니다. Beer 샘플 애플리케이션에서 테스트할 수 있으며, 위의 문서 작성자로 뷰를 변경하는 것을 잊지 마세요. 현재 버전의 문서입니다.

결론

보시다시피 Couchbase에서 버전 관리를 수행하는 것은 그렇게 복잡하지는 않지만, 애플리케이션의 요구 사항과 제약 조건에 따라 애플리케이션에서 수행해야 하는 작업입니다. 다양한 솔루션이 있으며 이러한 옵션 중 모든 사용 사례에 완벽한 것은 없습니다.

이 특정 샘플 코드에서는 각 버전에 대해 문서 사본을 만드는 간단한 디자인으로 작업하고 있습니다. 이 접근 방식을 사용하면 JSON 문서뿐만 아니라 모든 값을 "무엇이든" 버전으로 만들 수 있다는 점이 흥미롭습니다. 앞서 말했듯이 이것은 가능한 접근 방식 중 하나이며 다른 디자인과 마찬가지로 애플리케이션이나 데이터베이스(이 경우 대부분의 데이터베이스)에 약간의 영향을 미칩니다:

  • 키 및 문서 수 늘리기
  • 예를 들어 문서를 업데이트할 때 애플리케이션이 현재 값을 가져오고, 버전을 만들고, 현재 버전을 저장해야 하는 등 작업 횟수가 두 배 이상 증가합니다.
  • 새 버전 추가 및 버전 번호 증가 시 일관성 관리(새 버전 생성, 버전 및 카운터 삭제 시 오류 처리 필요....)
예를 들어, 여기에 많은 기능을 쉽게 추가할 수 있습니다:
  • 특정 버전 수로 제한합니다,
  • replace() 작업의 버전 관리만 활성화합니다.
  • JSON 문서에 버전에 대한 특정 속성 추가(예: 버전 날짜)
  • ….

Couchbase 애플리케이션에서 버전 관리를 사용 중이라면 자유롭게 댓글을 달거나 사용 방법을 설명하는 작은 글을 작성해 주세요.

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

작성자

게시자 카우치베이스 팀

의 선임 웹 관리자입니다. 웹 사이트 관리자로서 디자인, 구현, 콘텐츠 및 성능을 포함한 웹 사이트 자산에 대한 전반적인 책임을 맡고 있습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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