이벤트

이벤트 서비스를 사용하여 여러 소스의 데이터 통합하기

Couchbase와 같은 문서 기반 데이터베이스를 사용하면 얻을 수 있는 많은 장점 중 하나는 경직되고 미리 정해진 스키마의 제약 없이 유연한 데이터 모델을 사용하여 데이터를 저장할 수 있다는 점입니다. 많은 고객이 여러 소스에서 데이터 수집을 지원하기 위해 NoSQL 데이터베이스를 선택합니다. 하지만 기존 데이터와 일치하도록 데이터를 변환해야 한다면 어떻게 해야 할까요? 보고 목적으로 모든 데이터를 통일된 형식으로 변환해야 할 수도 있습니다. 이유가 무엇이든, 이 기능은 이벤트 서비스 에서

카우치베이스 이벤트 서비스

이벤트 서비스는 자바스크립트 함수를 적용할 수 있는 Couchbase Enterprise Edition의 기본 제공 기능입니다, 또는 람다를 사용하여 변경 이벤트에 대응할 수 있습니다. 문서가 생성, 수정 또는 삭제될 때마다 다음과 같은 조치를 취할 수 있습니다. by 자바스크립트에서 순수한 비즈니스 로직을 실행합니다.. 데이터 보강, 외부 워크플로 호출(RESTful API 호출을 통한), 타이머 기반 이벤트(향후 실행 재개) 등 여러 가지 작업을 수행할 수 있습니다. 이벤트를 레거시 데이터베이스로 생각하기 포스트를 트리거합니다.

데이터 통합

이 간단한 예제에서는 고객 데이터에 대한 두 개의 새로운 데이터 소스를 확보했다고 가정해 보겠습니다. 이 데이터는 정규화된 소스나 플랫 파일 또는 둘 다에서 가져온 것일 수 있으며, 이 데이터가 비정규화된 형식으로 저장된 기존 고객 데이터와 일치하기를 원합니다.

첫 번째 데이터 소스는 정규화된 데이터베이스(깨끗하고 정확한) 캐나다에 있는 고객을 포함합니다. 각 고객 기록은 청구 및 배송 주소를 가리키며, 각 주소는 도시 및 주 데이터의 중복을 제거하기 위해 정규화됩니다:

Normalized datasource for eventing
두 번째 데이터 소스는 캐나다 고객이 포함된 플랫 파일이지만 별도의 청구 및 배송 주소를 추적하지 않습니다. 보시다시피 단일 주소 데이터 요소만 는 고객 기록 내에 저장됩니다:

Customer table, data model of single address data

청구 및 배송 주소가 고객 데이터에 첨부되도록 비정규화된 기존 고객 데이터베이스와 일치하도록 이 데이터가 들어오는 대로 변환해야 합니다(두 번째 소스에서)를 하위 문서로 사용합니다:

Creating sub-documents on denormalzied data model

다음부터 시작하겠습니다. 쉬운 솔루션의 첫 번째 단계는 플랫 파일 가져오기입니다. 이 데이터를 변환하는 프로세스에는 고객 데이터(이름, 이메일, 전화번호, 회사명)를 새 문서로 복사하는 작업이 포함됩니다. 그런 다음 주소 데이터를 청구 주소와 우편 주소 모두에 대한 하위 문서로 복사해야 합니다. 고객당 하나의 주소만 있으므로 이 주소를 청구서 및 우편 주소 하위 문서에 모두 복사합니다:

Importing and transforming subdocuments
테이블 통합을 위한 자바스크립트 코드

이를 위한 이벤트 코드는 매우 간단합니다:

위의 코드는 자바스크립트 코더가 아니더라도 충분히 이해하기 쉬울 것이지만, 확실히 하기 위해 섹션별로 나눠서 설명하겠습니다.

    • 1호선 는 소스 버킷의 문서가 변경(생성 또는 수정)될 때마다 호출됩니다. 아래에서 소스 버킷을 정의하는 방법을 살펴보겠습니다.
    • 2-3줄에서는 새 고객 문서와 고객 문서 내에서 하위 문서로 사용될 주소 문서를 보관할 JavaScript 객체를 만듭니다.
    • 라인 5-15 원본 문서의 속성을 고객 및 주소 개체로 복사합니다.
    • 18번과 19번 라인 주소 문서를 우편 주소 및 청구 주소 속성에 대한 고객 하위 문서로 지정합니다.
    • 22번 라인 는 실제로 Couchbase 대상 버킷에 문서를 생성합니다. 아래에서 대상 버킷을 정의하는 방법을 살펴보겠습니다.
    • 마지막으로 25번째 줄 를 누르면 원본 문서가 삭제되지만 여기에 주석이 달립니다.
    • 27번 라인 는 작업을 기록합니다. 테스트 후 댓글을 달거나 삭제할 수 있습니다.

환경 설정

이 스크립트를 테스트하려면 Couchbase 환경을 설정해야 합니다. 우선, 데이터 서비스와 이벤트 서비스를 실행하는 Couchbase 클러스터가 필요합니다. 이 클러스터는 Docker에서 실행되는 단일 노드 클러스터만큼 작을 수도 있고, Capella에서 실행되는 대규모 멀티노드 클러스터일 수도 있습니다.

클러스터를 실행하고 나면 데이터를 가져오기 위한 버킷과 최종 대상 버킷을 만들어야 합니다. 이벤트 서비스에는 메타데이터 버킷도 필요합니다. 다음 네 개의 버킷을 만들고, 각각 최소 할당량은 100MB입니다:

    • 스키마1
    • 스키마2
    • 고객
    • eventing_merge 

또한 다음을 사용하도록 설정하는 것이 좋습니다. 플러시 이 연습을 위해

이벤트 함수 만들기

이제 이벤트 함수를 만들어야 합니다. 이벤트 함수에서 이벤트 탭을 클릭한 다음 기능 추가. 다음 설정을 사용합니다:

Eventing function settings in Couchbase

다음을 클릭합니다. 다음: 코드 추가 를 클릭하고 기본값 온업데이트 함수에 위의 코드를 추가합니다. 클릭 저장 및 반환. 이 시점에서 코드는 저장되었지만 데이터 처리를 시작하려면 함수를 배포해야 합니다. 함수 이름을 클릭하여 설정을 열고 지금 바로 함수를 배포하세요.

테스트 JSON 문서 만들기

이제 문서를 생성하여 테스트해 보겠습니다. 스키마2 버킷에 추가합니다. 다음을 사용하여 문서를 추가합니다. wile.e.coyote@acmecorp.com 를 문서 키로 사용하고 문서 본문은 다음과 같이 작성합니다:

잠시 후 이벤트에 대한 통계가 성공적으로 표시되는 것을 확인할 수 있습니다:

event status feedback

이제 고객 버킷에 들어가면 위의 문서가 변환된 것을 볼 수 있습니다. 이제 주소가 속성 내에 하위 문서로 존재하는 것을 확인할 수 있습니다. 청구_주소 그리고 메일링_주소:

sampel JSON document for addresses

하위 문서로 변환하기

이제 좀 더 복잡한 스키마 변환을 해보겠습니다. 하위 문서 구조에 맞게 관계형 구조를 마이그레이션하는 것은 다음과 같습니다:

Migrating the relational structure to match our sub-document structure
주소 및 우편번호 테이블을 배송/우편 주소와 청구 주소에 대해 각각 하나씩 하나의 하위 문서로 비정규화해야 합니다. 이 경우 세 테이블의 데이터는 버킷 내의 컬렉션에 저장됩니다. 

비정규화를 위한 자바스크립트 코드

이전과 마찬가지로 이 코드를 다시 분석해 보겠습니다.

    • 2~4줄 새 문서와 메일링 및 청구 주소에 대한 하위 문서를 저장하는 JavaScript 객체를 만듭니다.
    • 6~10줄 연락처 속성을 새 문서에 복사합니다.
    • 12번 및 13번 라인 연락처 주소_id 속성에 저장된 문서 키를 사용하여 주소 컬렉션의 주소 데이터를 복사합니다.
    • 15~19줄 주소 문서의 province_id를 문서 키로 사용하여 시/도 컬렉션에서 시/도 데이터를 가져옵니다.
    • 21번과 22번 라인 를 클릭한 다음 이러한 문서 개체를 새 연락처 문서에 하위 문서로 첨부합니다.
    • 마지막으로, 26번째 줄 은 대상 버킷에 새 문서를 씁니다.
    • 29번 라인를 누르면 소스 버킷에서 원본 연락처 문서가 삭제됩니다. 다른 연락처에서 사용할 수 있으므로 연결된 주소 및 시/도 문서도 삭제하지 않으려 합니다.

비정규화를 위한 이벤트 함수 만들기

다음 설정을 사용하여 이 이벤트 함수를 생성하고 위의 코드를 붙여넣은 다음 온업데이트 함수를 호출합니다. 완료되면 함수를 배포합니다.

Setting up an eventing function in Couchbase

이 기능을 테스트하려면 컬렉션을 생성해야 합니다. 스키마1 버킷 ( 기본값 범위)에 이름을 추가합니다: 주소, 고객, 우편_코드. 그런 다음 다음 문서를 생성합니다(이 순서대로, 그렇지 않으면 함수의 조회가 실패합니다):

우편번호 컬렉션(문서 ID 포함) 43062:

우편번호 컬렉션(문서 ID 포함) 23228:

주소 컬렉션(문서 ID 포함) 000071:

주소 컬렉션(문서 ID 포함) 000086:

마지막으로 고객 컬렉션(문서 ID 포함) blinded_by@science.com:

이 기능에 대한 통계가 성공적으로 표시되는 것을 금방 확인할 수 있습니다:

Function success status

그리고 고객 버킷의 문서를 보면 두 주소가 하위 문서로 정규화되어 다음과 같이 변환된 것을 볼 수 있습니다.

Automatic denormalization of JSON documents using eventing

마무리 생각

이것은 매우 간단한 예입니다. 프로덕션 환경에서는 예외를 처리하는 코드를 추가할 가능성이 높습니다.  

또한 대규모 데이터 세트가 있고 더 높은 성능이 필요한 경우 작업자 수를 1에서 vCPU 수로 늘릴 수 있습니다.

이 블로그에서 사용된 이벤트 함수는 다음 깃허브 리포지토리에서 확인할 수 있습니다: https://github.com/djames42/cb_eventing_merge. 이 리포지토리에는 이벤트 함수와 대규모 샘플 데이터 세트가 미리 로드된 단일 노드 클러스터를 구축하는 데 사용할 수 있는 두 개의 스크립트(Bash 스크립트와 Python 스크립트)도 있습니다.

리소스

참조

 

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

작성자

게시자 다니엘 제임스, 선임 솔루션 엔지니어

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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