이 포스팅에서는 다음과 같이 카우치베이스 이벤트 서비스 카우치베이스 실리콘 밸리 2017에서 기술 키노트 데모 애플리케이션입니다.
아직 데모에 익숙하지 않거나 카우치베이스 이벤트 서비스에 대한 자세한 내용은 이 글 끝에 있는 리소스를 참조하세요. 전체 애플리케이션 세트의 소스 코드는 다음과 같습니다. GitHub에서 사용 가능.
소개
데모에서는 NFC 기능이 있는 휴대폰을 사용하여 배터리가 없는 패치에서 온도를 읽습니다. 판독값은 FHIR 관측 리소스 를 사용하여 JSON으로 카우치베이스 라이트. 그런 다음 이러한 문서는 카우치베이스 서버 클러스터를 통해 동기화 게이트웨이.
웹 클라이언트에는 거의 실시간으로 환자 정보를 추적하도록 설계된 대시보드가 있습니다. 여기에는 몇 가지 일반적인 문제가 있습니다. 어떻게 할까요?
- 시스템의 다른 부분에서 작성한 기록을 기반으로 대시보드 업데이트하기
- 필요한 정보를 효율적으로 전송
이벤트 서비스가 이 두 가지를 어떻게 지원하는지 살펴보겠습니다.
클라이언트에 업데이트 푸시하기
없이도 활성 데이터베이스를 사용하면 적어도 몇 가지 다른 방법으로 이 작업을 수행할 수 있습니다. 예를 들어, 메시지 대기열에 판독값을 게시하거나 데이터베이스를 폴링하는 방법을 찾을 수 있습니다. 두 가지 접근 방식 모두 단점이 있습니다.
- 메시지 대기열을 추가하면 인프라가 더 복잡해지고 장애가 발생할 가능성이 높아집니다.
- 여론조사는 말 그대로 여론조사입니다.
대신 다음을 사용하여 이 문제를 처리했습니다. 카우치베이스 기능이벤트 서비스의 기능입니다. 함수는 데이터베이스의 변경 사항을 수신합니다. (엄밀히 말하면 함수는 카우치베이스 데이터베이스 변경 프로토콜 피드) 그런 다음 자바스크립트로 두 개의 콜백을 작성합니다, 온업데이트
그리고 OnDelete
를 사용하여 모든 문서 생성/업데이트 및 삭제 이벤트에 대해 각각 호출할 수 있습니다. 이를 통해 클러스터에서 직접 실행되는 반응형 코드를 구현할 수 있습니다.
(참고로 이 문제를 해결하기 위해 동기화 게이트웨이 웹 후크. 이 접근 방식은 우리가 사용했던 기법과 몇 가지 공통점이 있습니다. 몇 가지 단점이 있지만 이는 다른 게시물에서 다룰 주제입니다.)
데이터 효율성
모바일 앱은 수많은 관련 정보를 기록해야 하는 온도 측정값을 기반으로 문서를 생성합니다.[1] 대시보드에는 해당 데이터의 작은 하위 집합만 필요합니다. 키/값 조회를 통해 전체 문서를 검색할 수 있습니다. 이 방법은 빠르지만, 우리가 신경 쓰지 않는 데이터를 전송해야 한다는 뜻입니다. 대시보드에서 N1QL 쿼리를 사용하여 데이터를 압축할 수 있습니다. N1QL은 매우 효율적이지만 여전히 쿼리 노드를 통해 처리해야 합니다.
함수를 사용하면 업데이트할 때마다 문서 사본을 받을 수 있습니다. 당연히 거기에서 원하는 데이터를 아주 쉽게 추출할 수 있습니다. 이벤트는 독립 서비스를 사용하면 함수에 할당하는 리소스를 나머지 클러스터와 별도로 확장할 수 있습니다.
코드
여기에 관련된 실제 코드는 매우 간단합니다.
카우치베이스 기능
다음은 함수 부분입니다. Couchbase Server 콘솔의 이벤트 패널을 통해 또는 REST 호출을 통해 추가하도록 설정합니다.[2]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
함수 온업데이트(doc, 메타) { 만약 (doc.리소스 유형 != '관찰') 반환; let 참조 = doc.subject.참조; let URL = "http://localhost:8080/events/" + 참조.substr(9); let 데이터 = JSON.문자열화({ "참조": doc.subject.참조, "code": doc.코드.코딩[0].코드, "recordedAt": doc.발행, "value": doc.valueQuantity.값 }); let curl = 선택 CURL($URL, { "요청": "POST", "header": [ "콘텐츠 유형: 애플리케이션/json", "수락: 신청/제이슨" ], "데이터": $데이터 }); curl.실행 쿼리(); } 함수 OnDelete(메타) {} |
FHIR 사양에서 문서에는 모두 리소스 유형
. '관찰' 리소스만 살펴보기 때문에 첫 번째 확인에서는 이를 필터링합니다.
다음으로, 대상 참조 필드에서 환자의 UUID를 추출합니다. 이는 웹 앱 서버 측에서 라우팅에 사용됩니다. (이에 대한 자세한 내용은 다음 섹션을 참조하세요.)
그런 다음 주제 참조, 관찰 유형, 특정 관찰을 수행한 날짜, 측정값을 나타내는 코드만 포함된 JSON 문자열을 생성합니다. 이것이 우리가 전달해야 하는 유일한 데이터입니다.
마지막으로, 저희는 cURL 기능을 사용하여 해당 데이터를 앱 서버 REST 엔드포인트에 게시할 수 있습니다. (SELECT 쿼리를 사용하여 CURL 함수를 실행하는 대신 이벤트의 자체 CURL 함수를 사용하는 것을 고려하세요.).
웹 서버 REST 엔드포인트
코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 |
라우터.post('/:id', 함수(req, res, 다음) { res.보내기(''); 만약 (sse[req.매개변수.id] === 정의되지 않음) 반환; // 아직 듣지 않음 sse[req.매개변수.id](`이벤트: 업데이트\데이터: { "values": [${JSON.문자열화(req.body)}]}\n\n`); }); 모듈.수출 = 라우터; |
Express를 사용하면 경로의 일부를 정의한 다음 사물을 함께 연결할 때 더 긴 경로에 매달아 놓을 수 있습니다. 따라서 여기에는 경로 사양의 끝 부분만 표시됩니다. 경로의 :id
요소는 URL의 마지막 세그먼트를 가져와 콜백에 매개변수로 전달하도록 Express에 지시합니다. 여기서 URL 경로의 마지막 부분에 환자 UUID를 추가한 것을 기억하세요. 이것이 바로 id
매개 변수가 설정됩니다.
cURL 호출로 이 경로를 트리거했으면 이제 웹 클라이언트로 정보를 푸시해야 합니다. 웹 소켓을 사용할 수도 있었습니다. 대신 서버 전송 이벤트. SSE는 웹 소켓보다 무게가 가볍기 때문에 이러한 용도로 잘 작동합니다. SSE에 대해서는 다른 글에서 자세히 살펴보겠습니다. 지금은 매우 간단한 형식을 사용하는 메시지 채널이라고 생각하시면 됩니다.
이를 통해 콜백 코드를 이해하기 위해 알아야 할 사항을 알 수 있습니다. 첫 번째 줄은 경로를 지정합니다. 두 번째 줄은 빈 응답을 전송하여 cURL 세션을 종료합니다. 다음으로 서버에서 보낸 이벤트 채널이 아직 설정되지 않았는지 확인합니다. 이는 클라이언트의 호출을 통해 이루어집니다. SSE 채널이 준비되면 데이터를 "업데이트" 이벤트로 태그하고 수신한 것과 동일한 JSON을 전송합니다.
결론
함수는 아마도 Couchbase Server 5.5에서 제가 가장 좋아하는 새로운 기능일 것입니다. 여기에서 한 가지 예를 살펴봤는데, 시작하는 데 많은 시간이 걸리지 않는다는 것을 알 수 있습니다. 다른 많은 사용 사례도 살펴볼 수 있습니다. 인프라를 추가하지 않고도 데이터와 함께 비즈니스 로직을 배포하고 쉽게 확장할 수 있다는 것은 매우 멋진 기능입니다.
리소스
다음에 대한 훌륭한 소개를 읽을 수 있습니다. 카우치베이스 이벤트 서비스 in 이 게시물. 또한 Couchbase Connect NYC 2018의 이 동영상도 확인해 보시기를 적극 추천합니다: 변화로 더 많은 성과 창출 - Couchbase 이벤트 소개