ASP.NET

ASP.NET 및 Nancy를 사용한 XDCR

새로운 교차 데이터 센터 복제(XDCR) 기능을 제공합니다. 가장 명백한 유틸리티는 한 Couchbase 클러스터에서 다른 클러스터로 데이터를 복제할 수 있도록 하는 것입니다. 그러나 XDCR에는 더 많은 새로운 사용 사례가 있습니다. 가장 주목할 만한 예 중 하나는 Couchbase와 Elastic Search의 통합입니다.

통신 엔드포인트가 간단한 RESTful API를 사용하여 구현되기 때문에 카우치베이스가 아닌 클러스터에 대해 XDCR을 수행할 수 있습니다. 몇 가지 간단한 방법을 구현하여 자체 복제 엔드포인트를 설정할 수 있습니다. 자체 XDCR 엔드포인트를 구축하려는 이유는 여러 가지가 있을 수 있습니다. 한 가지 간단한 예는 변경 알림을 받기 위해서입니다.

엔드포인트 설정은 매우 간단하며 RESTful API 구축에 적합한 모든 웹 프레임워크를 사용하여 수행할 수 있습니다. .NET에서는 ASP.NET MVC와 새로운 웹 API가 한 가지 옵션입니다. 좋은 옵션이긴 하지만 더 간단한 솔루션은 시나트라 영감 Nancy.

Nancy는 .NET으로 HTTP 기반 애플리케이션을 빌드하기 위한 경량 마이크로 프레임워크입니다. 가장 기본적인 경우, 다음에서 확장되는 모듈을 만듭니다. 낸시 모듈 를 클릭하고 경로와 핸들러를 생성합니다.

public 클래스 샘플 모듈 : Nancy.낸시 모듈
{
public 샘플 모듈()
{
Get[“/”] = _ => "Hello World!";
}
}

Nancy를 사용하여 XDCR 엔드포인트를 만드는 방법을 보여드리기 위해 다음과 같은 Couchbase Labs 프로젝트를 GitHub에 게시했습니다. 카우치베이스-xdcr-nancy. 이 프로젝트는 Jasdeep의 카우치베이스-XDCR-시나트라 코드.

Visual Studio 프로젝트 안에는 여러 개의 배관 파일이 있습니다. 여기서는 코드를 자세히 살펴보지는 않겠지만 몇 가지 주요 내용을 보여드리겠습니다. 가장 중요한 코드는 XdcrModule 클래스입니다. 이 클래스에서 XDCR 서비스가 수행하는 다양한 리소스 요청에 대한 핸들러를 찾을 수 있습니다.

이 모듈의 생성자 안에는 /pools로 시작하는 URI에 대한 요청을 처리하는 수많은 GET 핸들러가 있습니다. 이는 클러스터와 해당 버킷에 대한 정보를 검색하기 위해 XDCR에서 사용하는 핸드셰이크 URI입니다(Couchbase SDK에서 클라이언트 인스턴스를 부트스트랩하는 데 사용하는 엔드포인트와 유사). 이 샘플에서는 버킷이 "기본값"으로 하드코딩되어 있습니다. 이 값을 쉽게 수정하거나 구성 설정으로 만들 수 있습니다.

Get["/pools"] = x =>
{
변수 출력 = new
{
= new 객체[]
{
new { 이름 = "default", uri = "/pools/default?uuid=" + UUID_POOL }
},
uuid = UUID_POOL
};

반환 응답.AsJson(출력);
};

GET 핸들러 뒤에는 실제 XDCR 피드에 응답하는 두 개의 POST 핸들러가 있습니다. XDCR 서비스는 경로의 일부로 매개변수를 전달합니다. 이를 위해 정규식 기반 경로가 사용됩니다.

첫 번째 POST 핸들러는 XDCR 서비스에서 문서 목록과 해당 수정본을 받습니다.

게시물[REGEX_REVS_DIFF] = x =>
{
var body = “”;
컨텍스트.요청.본문.위치 = 0;
사용 (var sr = new StreamReader(컨텍스트.요청.본문))
{
body = sr.ReadToEnd();
}
var jobj = JObject.Parse(body);

var outDict = new 사전<문자열, 객체=“”>();
foreach (var item in jobj)
{
var 키 = 항목.;
var rev = 항목.가치.ToString();
만약 (핸들러.IsMissing(key, rev))
{
outDict[] = new { 누락 = rev };
}
}

반환 응답.AsJson(outDict);
};문자열,>

이 핸들러 내에서 JSON을 파싱하여 키와 리비전을 찾습니다. 해당 조합이 복제되지 않은 것으로 확인되면 요청에 대한 응답에 포함된 '누락된' 키 목록에 추가됩니다. 그런 다음 XDCR은 해당 문서를 다른 POST 핸들러로 전송하여 문서를 생성합니다.

게시물[REGEX_BULK_DOCS] = x =>
{
var body = “”;
컨텍스트.요청.본문.위치 = 0;
사용 (var sr = new StreamReader(컨텍스트.요청.본문))
{
body = sr.ReadToEnd();
}
var jobj = JObject.Parse(body);

var newEdits = jobj.가치<bool>("new_edits");
var docs = jobj.가치<JArray>("docs");
foreach (var doc in 문서)
{
var originalDoc = 인코딩.UTF8.GetString(변환.FromBase64String(doc.가치<문자열>("base64")));
var 메타 = doc["meta"] as JObject;

var 문서 = new 문서
{
Id = 메타.가치<문자열>("id"),
개정 = 메타.가치<문자열>("rev"),
만료 = 메타.가치<int>("만료"),
플래그 = 메타.가치<int>("flags"),
가치 = originalDoc
};

핸들러.문서 만들기(문서);
}

반환 HttpStatusCode.생성됨;
};

샘플에는 문서의 존재를 확인하고 필요할 때 생성하는 플러그 가능한 핸들러를 만드는 데 사용되는 매우 간단한 인터페이스가 포함되어 있습니다.

public 인터페이스 응용 프로그램 핸들러
{
bool IsMissing(문자열 키입니다, 문자열 rev);

void 문서 만들기(문서 문서);
}

데모를 위해 다음과 같은 예시도 포함했습니다. XmlReplicator 클래스에서 이 인터페이스를 구현합니다. 이 클래스는 LINQ to XML을 사용하여 XDCR 서비스에서 공급한 문서가 포함된 XML 문서를 업데이트하고 쿼리합니다.

public 클래스 XmlReplicator : 응용 프로그램 핸들러
{
비공개 읽기 전용 문자열 _path;
비공개 XDocument 문서 = new XDocument();

public XmlReplicator(문자열 경로 = @"C:tempreplication.xml")
{
_path = 경로;
만약 (! 파일.존재(_path))
{
//var xml = new XElement("documents");
파일.WriteAllText(경로,, 인코딩.UTF8);
}
}

...
}

문서가 존재하는지 확인합니다, IsMissing 은 XML에서 문서 자식이 있는 요소 id 그리고 rev 제공된 키와 리비전이 일치하는 요소입니다.

public bool IsMissing(문자열 키입니다, 문자열 rev)
{
var xml = XDocument.로드(_path);
var 문서 = xml.문서.루트.요소("문서");
var 문서 = 문서.Where(d => d.요소("meta").요소("rev").가치 == rev && d.요소("meta").요소("id").가치 ==);
반환 문서.Count() == 0;
}

기존 XML 파일에 문서를 추가하기만 하면 문서가 만들어집니다.

public void 문서 만들기(문서 문서)
{
var xml = XDocument.로드(_path);

var docElement = new XElement("문서",
new XElement("meta",
new XElement("id"문서.Id),
new XElement("rev"문서.개정),
new XElement("만료"문서.만료),
new XElement("flags"문서.플래그)
),
new XElement("value", new XCData(문서.가치))
);

xml.문서.루트.추가(문서 요소);
xml.저장(_path);
}

기본적으로 Nancy는 ASP.NET 개발 서버를 사용하도록 설정되어 있습니다. 원하는 방식으로 Nancy를 호스팅할 수 있습니다(IIS, 자체 호스팅 등). 프로젝트를 실행한 후에는 Couchbase 관리 콘솔에서 XDCR을 설정해야 합니다. 알아야 할 몇 가지 값

  • 낸시 포트 - 8675(프로젝트 설정에서 수정 가능)
  • 낸시 기본 인증: 관리자:쿼티 (수정하십시오. XdcrUserValidator)

마지막으로, 나만의 플러그인을 만들려면 응용 프로그램 핸들러 인스턴스에 유형을 등록하기만 하면 됩니다. 애플리케이션 부트스트래퍼 (또는 다른 구현을 삭제하세요).

container.Register(new XmlReplicator());

카우치베이스 랩 프로젝트는 완전히 지원되지는 않지만 포럼에 자유롭게 질문을 게시할 수 있습니다.

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

작성자

게시자 존 자블로키

존 자블로키는 NET. SDK 개발자입니다. John은 Beantown ALT.NET의 주최자이자 Fairfield University의 전 겸임교수이기도 합니다. Amazon에서 Couchbase Server를 설치하고 구성하는 방법을 설명하는 "Couchbase Essentials"라는 책을 확인할 수도 있습니다.

댓글 하나

  1. 안녕하세요,이 구현은 제 프로젝트에서 큰 사용 사례를 해결할 수 있습니다. 한 가지, 오류를 시도한 후 나는 좋은 진전에 도달했다고 생각하지만 복제가 한 가지 오류를 발생시킵니다. 클러스터를 생성하고 복제를 생성했지만 시스템이 복제를 시도 할 때이 오류가 발생합니다: 주의 - 2017-04-09 03:30:47 127.0.0.1:ToplogyChangeDetector:_pre_replicate 응답에서 vbopaque 누락. status_code=400 respMap=map[] vbno=400

    제발 제가 정말 가까이 있다고 생각하는데 무엇이 잘못되었는지 이해하도록 도와주실 수 있나요? 정말 감사합니다

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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