이 post사이의 복제에 대해 자세히 설명했습니다. 동기화 게이트웨이 (SG) 인스턴스의 카우치베이스 모바일 (CBM). 작동 예제를 설명하기 위해 Swing 기반 UI가 포함된 간단한 Java 애플리케이션을 작성했습니다. 모든 것을 보여드리기 위해 두 개의 SG 인스턴스와 함께 앱을 실행했습니다.
이 다이어그램은 애플리케이션의 흐름과 SG 쌍과의 통신을 보여줍니다.
편집 창에서 JSON 데이터를 입력할 수 있습니다. 해당 데이터는 카우치베이스 라이트 (CBL) 로컬 스토리지. 두 개의 복제가 설정되어 있습니다. 하나는 CBL 데이터베이스의 데이터를 기본 인스턴스라고 부르는 동기화 게이트웨이 인스턴스로 푸시합니다. 간단히 기본 인스턴스라고 부르겠습니다. 기본 인스턴스는 백업 SG 인스턴스(이하 백업이라고 함)에 스스로 복제합니다.
이를 확인하기 위해 저는 피드 변경 를 기본 및 백업에서 모두 삭제합니다.
모든 것이 Mac에서 함께 실행됩니다. 개발 컴퓨터에서 실행되는 전체 CBM 스택을 설정할 수 있습니다. 따라서 초기 개발이 더 쉬워집니다. 또한 모든 요소가 서로 어떻게 맞물려 작동하는지 이해하는 데 도움이 됩니다. 이 부분은 앞으로 블로그에 더 자세히 소개할 예정입니다.
구성과 코드를 살펴보겠습니다.
동기화 게이트웨이 구성
백업
저는 각 SG 인스턴스를 자체 JSON 구성 파일로 실행합니다. 백업 구성은 조금 더 간단합니다. 여기 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "<span class="hljs-attr">\uc778\ud130\ud398\uc774\uc2a4<\/span>":<span 클래스="hljs-string" 스타일="색상: #880000">":5984"</span>, "<span class="hljs-attr">adminInterface<\/span>":<span 클래스="hljs-string" 스타일="색상: #880000">":5985"</span>, "<span class="hljs-attr">\ub85c\uadf8<\/span>": [<span 클래스="hljs-string" 스타일="색상: #880000">"*"</span>], "<span class="hljs-attr"> \ub370\uc774\ud130\ubca0\uc774\uc2a4<\/span>": { "<span class="hljs-attr">db<\/span>": { "<span class="hljs-attr">\uc11c\ubc84<\/span>": <span 클래스="hljs-string" 스타일="색상: #880000">"월러스:"</span>, "<span class="hljs-attr">\uc0ac\uc6a9\uc790<\/span>": { "<span class="hljs-attr">GUEST<\/span>": {"<span class="hljs-attr">\ube44\ud65c\uc131\ud654<\/span>": <span 클래스="hljs-literal" 스타일="색상: #1f811f">false</span>, "<span class="hljs-attr">admin_channels<\/span>": [<span 클래스="hljs-string" 스타일="색상: #880000">"*"</span>] } } } } } |
두 개의 SG 복사본을 실행하기 때문에 서로 다른 네트워크 포트를 사용하도록 해야 합니다. 기본적으로 SG는 4984 및 4985 포트를 사용합니다. 백업의 첫 두 줄은 대신 5984 및 5985 포트에서 수신하도록 설정합니다. 이 포트에는 특별한 것이 없습니다. 컴퓨터의 다른 앱에서 사용하지 않는 포트를 선택하기만 하면 됩니다.
나머지 구성 파일은 SG가 모든 것을 기록하도록 하고, 특수 목적의 인메모리 데이터베이스("walrus" 키워드로 표시됨)에서 데이터를 제공하도록 설정하며, "GUEST" 사용자를 통해 누구나 공개적으로 액세스할 수 있도록 합니다. 초기 개발 단계에서 기억해두면 좋은 부분입니다. Walrus를 사용하면 서버 백엔드 없이 SG를 독립형으로 사용할 수 있습니다. 모든 액세스 권한이 있는 GUEST를 사용하면 인증 및 채널 설정에 대한 걱정 없이 작업을 실행할 수 있습니다. 기본적으로 SG는 stderr에 로그를 기록합니다. 대신 파일에 로깅하도록 옵션을 추가할 수 있습니다.
기본 및 인스턴스 간 복제
기본 설정에서 푸시 복제를 설정했습니다. 여기에는 몇 가지 동일한 상용구 매개변수가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "<span class="hljs-attr">\ub85c\uadf8<\/span>": [<span 클래스="hljs-string" 스타일="색상: #880000">"*"</span>], "<span class="hljs-attr"> \ub370\uc774\ud130\ubca0\uc774\uc2a4<\/span>": { "<span class="hljs-attr">db<\/span>": { "<span class="hljs-attr">\uc11c\ubc84<\/span>": <span 클래스="hljs-string" 스타일="색상: #880000">"월러스:"</span>, "<span class="hljs-attr">\uc0ac\uc6a9\uc790<\/span>": { "<span class="hljs-attr">GUEST<\/span>": {"<span class="hljs-attr">\ube44\ud65c\uc131\ud654<\/span>": <span 클래스="hljs-literal" 스타일="색상: #1f811f">false</span>, "<span class="hljs-attr">admin_channels<\/span>": [<span 클래스="hljs-string" 스타일="색상: #880000">"*"</span>] } } } }, "<span class="hljs-attr">\ubcf5\uc81c<\/span>":[ { "<span class="hljs-attr">\uc18c\uc2a4<\/span>": <span 클래스="hljs-string" 스타일="색상: #880000">"db"</span>, "<span class="hljs-attr">\ub300\uc0c1<\/span>": <span 클래스="hljs-string" 스타일="색상: #880000">"http://localhost:5985/db"</span>, "<span class="hljs-attr">\uc5f0\uc18d<\/span>": <span 클래스="hljs-literal" 스타일="색상: #1f811f">true</span> } ] } |
'복제' 섹션은 흥미로운 일이 일어나는 곳입니다. 항목이 배열임을 알 수 있습니다. 복제를 원하는 수만큼 지정할 수 있습니다. 여기서는 하나만 있습니다.
복제를 지정하려면 소스와 대상을 제공해야 합니다. 모든 복제는 단방향이라는 점을 기억하세요.
"source" 매개변수는 "db"로 식별되는 데이터베이스를 복제하려는 것을 나타냅니다. "데이터베이스" 아래에서 Walrus로 설정한 섹션을 확인할 수 있습니다.
대상은 동일한 SG 인스턴스에 연결된 다른 데이터베이스일 수도 있고, 여기처럼 HTTP URL을 지정할 수도 있습니다. URL의 경로 부분에 원격 데이터베이스의 이름을 사용합니다(이 경우 /db).
동기화 게이트웨이 실행
기본_게이트웨이_설정.json과 백업_게이트웨이_설정.json의 두 파일에 구성을 저장했습니다. 명령줄에서 수동으로 SG를 실행할 수 있습니다. 플랫폼별 SG 다운로드 및 실행에 대한 정보는 다음에서 확인할 수 있습니다. 여기.
먼저 백업을 시작합니다. 그렇지 않으면 Primary에서 복제를 수행하기 위한 연결 실패에 대한 많은 메시지를 표시합니다.
Java 앱
UI는 Swing을 사용하여 Java 앱을 작성하고 레이아웃은 IntelliJ IDEA를 사용했습니다. 앱 시작 시 앱의 모습은 다음과 같습니다.
사용하려면 가장 왼쪽 텍스트 창에 JSON을 붙여넣습니다. 저장 버튼을 클릭합니다. 그러면 새 JSON 문서가 CBL 데이터베이스에 저장됩니다. 동기화가 시작됩니다. 시작 버튼을 클릭하여 활성화합니다.
가운데 텍스트 창에서는 주 변경사항 피드를 모니터링합니다. 가장 오른쪽 창은 백업 변경사항 피드를 모니터링합니다.
동기화를 사용 설정하면 문서를 저장할 때마다 두 변경내용 피드가 모두 응답하는 것을 볼 수 있습니다. 다음은 그 모습입니다.
프로젝트의 소스는 다음에서 찾을 수 있습니다. GitHub. (이 샘플은 기본 사항을 강조한 것입니다. 프로덕션 품질 코드가 아닙니다.) 몇 가지 핵심 부분을 살펴보겠습니다.
네 가지 클래스가 있습니다. 대부분의 UI는 DBExplorer.java에 있습니다. DBService.java는 매우 일반적인 헬퍼 클래스입니다. CBL과 SG 간에 복제가 어떻게 설정되는지 보려면 여기를 살펴보세요. Runtime.java는 대부분 공유 인스턴스를 갖기 위해 존재합니다. Jackson JSON ObjectMapper.
SGMonitor.java는 두 개의 변경 피드 모니터링을 처리합니다. 저는 OkHttp 클라이언트 라이브러리를 사용하여 REST 호출을 수행합니다.
변경 사항 피드를 모니터링하기 위해 저는 롱폴링이라는 기능을 사용합니다. 롱폴을 사용하면 전송할 새 데이터가 없는 경우 HTTP 호출이 즉시 반환되지 않습니다. 대신 새 데이터가 전송될 때까지 기다리거나 시간이 초과됩니다. 그런 다음 연결이 닫힙니다. 즉, 변경 기록을 계속 확인하려면 루프가 필요합니다. 변경 기록은 JSON으로 전송된다는 점에 유의하세요. 결과는 배열로 번들로 제공되므로 응답당 하나 이상의 레코드를 가질 수 있습니다.
HTTP 요청을 간단하게 생성하기 위해 모든 호출에 필요한 매개변수가 추가된 URL 빌더를 생성합니다.
1 2 3 4 5 |
urlBuilder = HttpUrl.parse(URL).새로운 빌더() .추가 경로 세그먼트(<span 클래스="hljs-string" 스타일="색상: #880000">"_changes"</span>) .추가 쿼리 매개변수(<span 클래스="hljs-string" 스타일="색상: #880000">"피드"</span>, <span 클래스="hljs-string" 스타일="색상: #880000">"longpoll"</span>) .추가 쿼리 매개변수(<span 클래스="hljs-string" 스타일="색상: #880000">"timeout"</span>, <span 클래스="hljs-string" 스타일="색상: #880000">"0"</span>); |
이 내용을 읽어보면, 피드 유형 롱폴을 사용하여 _changes 엔드포인트에 연결하고 타임아웃을 0으로 설정하고 있습니다(0은 타임아웃이 발생하지 않음을 의미함).
루프를 실행하기 위해 SwingWorker 스레드를 설정했습니다. 이 스레드는 HTTP 요청을 작성하고 실행한 다음 응답을 기다립니다.
여기서 마지막 비결은 동기화 게이트웨이에 어떤 데이터가 필요한지 알려주는 것입니다. 모든 SG _changes 응답에는 "last_seq" 속성이 포함되어 있습니다. 이 속성은 클라이언트가 이미 수신한 레코드를 추적하는 데 도움이 되는 정수입니다. 처리한 데이터를 추적하는 것은 클라이언트의 책임입니다. 응답을 처리한 후에는 향후 요청에 "이후" 매개 변수를 추가하거나 업데이트해야 합니다. 그러면 SG는 최신 변경 사항만 전달할 수 있습니다.
다음은 루프의 후반부입니다.
1 2 3 4 5 6 7 8 |
문자열 body = 응답.body().문자열(); JsonNode tree = 매퍼.readTree(body); urlBuilder.설정 쿼리 매개변수(<span 클래스="hljs-string" 스타일="색상: #880000">"since"</span>, tree.get(<span 클래스="hljs-string" 스타일="색상: #880000">"last_seq"</span>).asText()); 게시(body); |
잭슨 오브젝트매퍼를 사용하여 변경 레코드를 구문 분석합니다. 그런 다음 last_seq 속성에서 추출한 값으로 쿼리 매개변수로 "since"를 추가합니다. 그러면 다음 요청에 대한 URL이 설정됩니다. 게시 호출은 UI의 텍스트 영역을 업데이트하는 작업을 처리합니다.
그게 다입니다. 전체 프로젝트를 하나의 컴퓨터에서 실행할 수 있습니다. 이를 통해 Couchbase Lite, 동기화 게이트웨이 및 복제를 자세히 살펴볼 수 있습니다. 즐겨보세요.
포스트 스크립트
더 많은 리소스를 확인하세요. 개발자 포털 트위터에서 팔로우하세요 카우치베이스 개발.
질문에 대한 답변을 게시할 수 있습니다. 포럼. 그리고 다음에도 적극적으로 참여합니다. 스택 오버플로.
다음 주소에서 저를 개인적으로 팔로우할 수 있습니다. 호드그릴리