중요 참고: 이 블로그 게시물에는 다음과 같은 개발자 미리 보기 CURL 함수에 대한 정보가 포함되어 있습니다. 이벤트. 카우치베이스 서버 6.5에서 CURL 함수가 변경될 예정입니다. 이벤트 서비스와 함께 cURL 사용하기: 업데이트 에서 자세한 내용을 확인하세요.
이벤트는 카우치베이스 서버에서 사용할 수 있는 새로운 서비스입니다. 신시내티 레즈는 이 기능을 사용하여 VIP 고객에게 보다 신속하게 서비스를 제공하고자 합니다. 한 명 이상의 VIP에게 컨시어지가 할당됩니다. VIP가 야구장에 입장하면 컨시어지에게 문자 메시지가 전송됩니다. 그러면 컨시어지는 좌석에서 VIP를 만날 수 있습니다.
개념 증명을 위해 함수(Eventing의 일부)를 사용하여 문자 메시지를 보내는 예제를 만들었습니다. 저는 트윌리오 평가판 계정 를 클릭해 메시지를 보냅니다. I 하지 마십시오. 생산 시스템에서 Twilio를 사용할 계획인지 문자 메시지를 사용할 계획인지 알 수 없었습니다. 하지만 Twilio는 무료이고 쉽게 시작할 수 있기 때문에 개념 증명에 사용하기로 결정했습니다. HTTP API만 있으면 원하는 메시징/알림 서비스를 사용할 수 있습니다.
이벤트 리뷰
여기서 이벤트에 대한 모든 세부 정보를 제공하지는 않겠습니다. 이미 제 동료들이 블로그에 많이 포스팅한 내용입니다. 자세한 내용은 해당 포스팅을 꼭 확인해 보세요:
하지만 간단히 설명하면 이렇습니다: 카우치베이스 함수(Eventing의 일부)를 사용하면 문서 생성/업데이트/삭제에 응답하는 JavaScript 함수를 작성할 수 있습니다. 이러한 함수 내에서 문서를 읽고, 문서를 (다른 버킷에) 쓰고, N1QL 쿼리를 실행하고, 다른 버킷에 curl
함수를 사용하여 HTTP 엔드포인트에 요청할 수 있습니다. 참고: 컬 구조는 아직 개발 중입니다. 이 기능은 개발 목적으로만 사용되며 프로덕션 환경에서는 사용해서는 안 됩니다.
위의 블로그 포스팅을 종합하여 Reds를 위한 이벤트 개념 증명을 만들려고 합니다.
티켓 스캔
첫 번째 단계는 게이트에서 고객의 티켓을 스캔하는 것입니다. 저는 다음과 같은 프로그램을 작성했습니다. 시뮬레이션 를 입력합니다. 그러면 Couchbase의 '티켓' 버킷에 무작위로 '티켓스캔' 문서가 생성됩니다.
티켓을 스캔하기 전에 버킷을 몇 가지 데이터로 미리 채워야 했습니다.
저는 1번부터 9번까지의 고객을 VIP로, 그 외의 고객은 '일반 고객'으로 정했습니다.
1 2 3 4 5 6 7 8 9 |
_버킷.Upsert("customer::1", new { 이름 = "조지 클루니" }); _버킷.Upsert("customer::2", new { 이름 = "조쉬 허처슨" }); _버킷.Upsert("customer::3", new { 이름 = "다리우스 러커" }); _버킷.Upsert("customer::4", new { 이름 = "브루클린 데커" }); _버킷.Upsert("customer::5", new { 이름 = "에디 베더" }); _버킷.Upsert("customer::6", new { 이름 = "닉 라치" }); _버킷.Upsert("customer::7", new { 이름 = "닉 고퍼" }); _버킷.Upsert("customer::8", new { 이름 = "조니 벤치" }); _버킷.Upsert("customer::9", new { 이름 = "라이언 콜린스" }); |
재미있는 점: 이 VIP들은 모두 실제 레드삭스 팬입니다!
또한 3명의 컨시어지를 만들어 VIP를 나눠서 관리했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
_버킷.Upsert("컨시어지::1", new { 이름 = "매트 그로브스", 셀 번호 = _yourVerifiedNumber, vips = new 목록<문자열> { "customer::1", "customer::2", "customer::9" } }); _버킷.Upsert("컨시어지::2", new { 이름 = "미스터 레드릭스", 셀 번호 = _yourVerifiedNumber, vips = new 목록<문자열> { "customer::3", "customer::4", "customer::5" } }); _버킷.Upsert("컨시어지::3", new { 이름 = "로지 레드", 셀 번호 = _yourVerifiedNumber, vips = new 목록<문자열> { "customer::6", "customer::7", "customer::8" } }); |
위의 예에서는 고객 1, 2, 9를 "Matt Groves"에게 배정하고 있습니다. 즉, 조지 클루니, 조쉬 허처슨, 라이언 콜린스가 컨시어지 Matt Groves가 관리하도록 배정된 VIP입니다. (바꾸기 _yourVerifiedNumber
Twilio에서 확인한 전화번호로).
또한 문서에 Twilio 자격 증명을 저장하고 있습니다. 이렇게 한 이유는 Couchbase 함수 내부에 자격 증명이 필요하고 거기에 하드 코딩하고 싶지 않았기 때문입니다. 자격 증명 문서는 다음과 같습니다:
1 2 3 4 5 6 |
{ "url": "https://api.twilio.com/2010-04-01/Accounts//Messages.json", "username": "", "비밀번호": "", "fromNumber": "" } |
새 "티켓 스캔" 문서를 만드는 콘솔 앱을 만들었습니다. 이 앱을 실행할 때 VIP 스캔 또는 "일반 조" 스캔을 만들도록 선택할 수 있습니다.
1 2 3 4 |
콘솔.WriteLine("1 - VIP 티켓 스캔 시뮬레이션."); 콘솔.WriteLine("2 - 일반 조 티켓 스캔 시뮬레이션"); 콘솔.WriteLine("Q - 시뮬레이션 종료."); var 선택 = 콘솔.ReadKey().KeyChar; |
티켓 스캔 문서에는 고객 문서의 ID, 타임스탬프, 좌석 번호의 세 가지 필드만 포함됩니다.
1 |
_버킷.Upsert(티켓스캔아이디, new {CustomerId = customerId, 타임스탬프 = 티켓 스캔 타임스탬프, 좌석 = 좌석 정보 }); |
다음에서 깃허브의 전체 소스 코드.
이벤트 기능
이 이벤트 예제의 핵심은 함수입니다. 이 함수를 만들 때는 아래 그림과 같이 "notifyConcierge"라는 함수를 만들었고, "tickets_metadata" 버킷을 사용했습니다. 가장 중요한 것은 "tickets" 버킷의 별칭을 만들어 "src"라고 불렀다는 점입니다. 함수 내에서 이 버킷은 읽기 전용이지만 고객 및 컨시어지 정보와 Twilio 자격 증명을 가져오는 데 필요합니다.
그리고 전체 함수는 깃허브에서 확인할 수 있습니다.. 다음은 기능에 대한 단계별 분석입니다:
1 - 변경된 문서가 티켓스캔인가요? 그렇다면 계속 진행합니다. 그렇지 않은 경우 이 함수는 이를 무시할 수 있습니다.
1 |
만약 (메타.id.indexOf("티켓스캔::") !== -1) { |
2 - 이 티켓을 스캔한 고객이 VIP인가요? 그렇다면 컨시어지의 세부 정보를 확인한 후 계속 진행하세요. 그렇지 않으면 무시하세요. 이 부분의 함수에서 인라인 N1QL을 주목하세요. 이는 카우치베이스 함수에서 사용되는 자바스크립트 특유의 기능입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let customerId = doc.customerId; let stmt = 선택 t.셀 번호, t.이름 FROM 티켓 t 어디 ANY v IN t.vips 만족 v == $customerId END; //컨시어지 받기(하나만 있어야 함) let 컨시어지 = null; 에 대한 (var 기록 의 stmt) { 컨시어지 = 기록; } // 다음과 같은 경우에만 알림을 진행합니다. // 고객에게 컨시어지가 있습니다. 만약 (컨시어지) { |
3 - VIP의 세부 정보를 확인합니다.
1 |
let 고객 = src[customerId]; |
4 - Twilio 자격 증명을 받습니다.
1 |
let twilio인증정보 = src["twilio::credentials"]; |
5 - 메시지 작성(VIP의 이름, 좌석 번호, 컨시어지 이름 포함). 데이터
는 Twilio의 API를 사용하는 데 필요한 최소한의 정보입니다.
1 2 3 |
let 메시지 = "안녕하세요'" + 컨시어지.이름 + "'. 귀하에게 배정된 VIP가 방금 체크인했습니다. '" + 고객.이름 + "'는 '"로 바뀝니다. + doc.seat + "'"; let 에서 = twilio인증정보.fromNumber; let 데이터 = "To=" + 컨시어지.셀 번호 + "&From=" + 에서 + "&Body=" + 메시지; |
6 - Twilio API를 사용하여 컨시어지에게 문자 메시지를 보냅니다. 컬 구조는 아직 개발 중입니다. 이 기능은 개발 목적으로만 사용되며 프로덕션 환경에서는 사용해서는 안 됩니다.
1 2 3 |
let URL = twilio인증정보.URL; let auth = twilio인증정보.사용자 이름 + ": " + twilio인증정보.비밀번호; var 결과 = curl(URL, { "데이터": 데이터, "header": ["콘텐츠 유형: x-www-form-urlencoded"], "method": "POST", "auth": auth }); |
이벤트 실행 중
이제 티켓 스캔 문서가 생성되거나 수정될 때마다 컨시어지에게 휴대폰으로 알림이 전송됩니다. 다음은 티켓 스캔부터 SMS 알림까지 전체 데모의 예시입니다:
이 이미지에서는 4개의 티켓 스캔을 생성하고 있습니다. 첫 번째는 VIP용, 다음 두 개는 일반 조스용, 마지막은 VIP용입니다. 두 개의 문자 메시지가 나타납니다. 실제로는 각기 다른 휴대폰에 표시되지만 테스트를 위해 모든 알림을 하나의 번호로 전송하고 있습니다. 참고: 저는 join.me 를 클릭하여 콘솔과 나란히 라이브 Android 화면을 표시합니다.)
문제가 발생하는 경우 다행히도 Couchbase의 함수에서 디버깅을 사용할 수 있다는 점이 다행입니다. 자바스크립트에서 중단점을 설정하고 Chrome과 같은 도구를 사용하여 단계별로 진행할 수 있습니다. 이에 대한 자세한 내용은 이벤트 공지 게시물.
요약
이 기능을 카우치베이스의 이벤트 시스템에서 실행하면 VIP에 대한 새로운 티켓 스캔이 발생할 때마다 문자 메시지 알림이 트리거됩니다. 티켓 스캔 시스템은 데이터가 Couchbase에 저장되는 한 Twilio에 대해 아무것도 알 필요가 없습니다. 또한 다음과 같은 경우 기타 시스템이 티켓 스캔 문서를 만들면 거기서도 SMS가 트리거됩니다. 로직은 다음과 같습니다. 닫기 를 데이터에 추가합니다.
이것으로 신시내티 레즈 시리즈 포스팅을 마무리합니다(현재로서는). 시리즈의 다른 두 게시물은 다음과 같습니다:
- 카우치베이스 서버를 사용한 Nifi 처리 및 흐름 - 이것이 레드팀이 실제로 티켓 스캔 데이터를 카우치베이스에 입력하는 방식입니다.
- 카우치베이스 및 Knowi를 사용한 데이터 시각화 - 이는 레드팀이 티켓 스캔 데이터를 사용하는 또 다른 사용 사례입니다.
아래에 댓글을 남기거나 다음에서 저를 찾아주세요. 트위터 @mgroves. Go Reds!
좋은 블로그 게시물과 블로그 타이밍이 좋았습니다!
함수에서 오류를 기록/디버깅하는 방법. 기본적으로 작동하지 않는 경우 디버깅할 위치.
로깅/디버깅 정보는 다음을 참조하세요. https://docs.couchbase.com/server/6.0/eventing/eventing-debugging-and-diagnosability.html (베타 버전을 사용하는 경우 6.5로 대체).