카우치베이스 6.6의 출시와 함께 이벤트 서비스의 기능이 크게 개선되었습니다.
취소 타이머() 함수를 사용하거나 기존 타이머와 동일한 참조 식별자를 가진 새 타이머를 생성하여 취소할 수 있는 새로운 이벤트 타이머가 도입되었습니다. 반복 타이머도 완벽하게 지원되며, 타이머 콜백을 사용하여 새로운 타이머를 생성함으로써 반복 로직을 쉽게 만들 수 있습니다. 타이머 스케줄링을 사용하면 성능에 부정적인 영향을 미치지 않고 며칠, 몇 주 또는 몇 년 후의 타이머를 만들 수 있습니다. OnDelete 핸들러는 이제 새로운 "options" 매개변수를 사용해 문서가 삭제되었는지 만료되었는지를 표시합니다. 이제 UI의 주요 이벤트 통계가 각 함수 수명 주기 제어와 함께 배치됩니다.
이러한 개선 사항을 통해 강력한 비즈니스 로직을 만드는 데 필요한 노력과 코드를 간소화할 수 있습니다.
전제 조건
이 문서에서는 주요 이벤트 최신 GA 릴리스, 즉 Couchbase 버전 6.6.0에 추가된 개선 사항과 각 항목에 대해 작동하는 기본 예제를 제공합니다. 그러나 이 문서에서 제공하는 이벤트 함수 중 어느 것도 이전 버전의 카우치베이스 서버에서 큰 변경이나 복잡한 작업 없이 "있는 그대로" 작동하지는 않는다는 점을 이해해 주시기 바랍니다..
카우치베이스 또는 이벤트 서비스에 익숙하지 않은 경우 시작하기와 이벤트 예시 중 하나를 구체적으로 참조하세요:
- 의 지침에 따라 작동하는 Couchbase 6.6.0 서버를 설정합니다. 여기서 시작하세요!
- 기본 이벤트 개념과 기본 이벤트 함수를 배포하는 방법을 모두 이해합니다. 문서 보관 예제.
이제 이벤트 타이머를 취소할 수 있습니다.
취소 타이머() 함수를 추가하거나 기존 타이머와 동일한 참조 식별자를 가진 새 이벤트 타이머를 생성하면 아직 실행되지 않은 활성 타이머를 취소할 수 있습니다. 이 기능 개선으로 강력한 비즈니스 로직을 만드는 데 필요한 코드가 간소화되었습니다.
개발자는 더 이상 필드와 로직을 추가하고, 실행 중인 타이머가 '오래되어' 새로운 타이머로 대체되지 않도록 추가 확인 작업을 수행하지 않아도 됩니다.
예시:
- 이벤트용 '소스' 버킷과 '메타데이터' 버킷을 만듭니다.
- 이 함수를 배포합니다(아래 코드).
- 를 사용하여 소스 버킷에 문서를 만듭니다:
1KEY user_scoreboard::1 그리고 데이터 {"type": "user_scoreboard", "id": 1} - 잠시 후 로그를 확인합니다.
- "user_scoreboard::1" 키를 사용하여 문서를 삭제합니다.
- 잠시 후 로그를 확인합니다.
- 이 기능을 배포 해제합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
함수 사용자 비활성 콜백(컨텍스트) { 로그('사용자가 10분 동안 비활성 상태였습니다', 컨텍스트.docId); /* * 몇 가지 조치를 취하십시오 ... */ } 함수 온업데이트(doc, 메타) { 만약 (doc.유형 != 'user_scoreboard') 반환; // 지금으로부터 600초 후 타임스탬프 만들기 var tenMinutesFromNow = new 날짜(); // 현재 시간을 가져와서 600초를 더합니다. tenMinutesFromNow.setSeconds(tenMinutesFromNow.getSeconds() + 600); // 사용자의 점수판을 변경할 때마다 타이머가 새로 생성되지만 // 이전 타이머는 동일한 식별자 meta.id를 가지므로 취소됩니다. createTimer(사용자 비활성 콜백, tenMinutesFromNow, 메타.id, { "docId": 메타.id }); } 함수 OnDelete(메타, 옵션) { 만약 (!(메타.id.startsWith("user_scoreboard:"))) 반환; 로그('사용자 점수판이 삭제되었습니다', 메타.id); // 더 이상 관련 문서가 없으므로 타이머를 제거합니다. 취소 타이머(사용자 비활성 콜백,메타.id); /* * 몇 가지 조치를 취하십시오 ... */ } |
이제 반복 이벤트 타이머가 완전히 지원됩니다.
반복 타이머가 완전히 지원됩니다. 즉, 타이머 콜백에 의해 호출되는 함수는 새로운 타이머를 안정적으로 생성할 수 있습니다. 이 업데이트를 통해 단일 이벤트 함수가 다른 타이머의 콜백 내에서 새 타이머를 생성하는 복잡한 반복 이벤트를 안정적으로 구현할 수 있습니다.
이전에는 반복되는 일련의 타이머(왼쪽 이미지)를 안정적으로 생성하기 위해 공동 함수가 필요했지만, 6.6 릴리스에서는 반복(또는 예약) 비즈니스 로직을 구현하는 데 필요한 코드가 간소화되었습니다(오른쪽 이미지).
예시:
- 이벤트용 '소스' 버킷과 '메타데이터' 버킷을 만듭니다.
- 함수 설정에서 읽기+쓰기 모드의 소스 버킷에 대한 버킷 별칭을 "src_bkt"로 설정합니다.
- 이 함수를 배포합니다(아래 코드).
- 를 사용하여 소스 버킷에 문서를 만듭니다:
1KEY 반복_타이머::1 그리고 데이터 {"type": "recurring_timer", "id": 1, "active": true} - 잠시 후 로그를 확인합니다.
- 몇 분 후에 로그를 검사합니다.
- "recurring_timer::1" 키를 사용하여 문서를 변경하고 다음과 같이 "active" 필드를 false로 변경합니다:
-
1KEY 반복_타이머::1 그리고 데이터 {"type": "recurring_timer", "id": 1, "active": false}
- 잠시 후 로그를 확인합니다.
- 이 기능을 배포 해제합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
함수 크리에이트 리커링 타이머(컨텍스트) { 로그('From CreateRecurringTimer: 타이머 생성', 컨텍스트.모드, 컨텍스트.id); // 지금부터 30초 후 타임스탬프 만들기 var thirtySecFromNow = new 날짜(); // 현재 시간을 가져와 30초를 더합니다. thirtySecFromNow.setSeconds(thirtySecFromNow.getSeconds() + 30); // 컨텍스트에 맞게 아웃으로 사용할 문서를 만듭니다. createTimer(RecurringTimerCallback, thirtySecFromNow, 컨텍스트.id, 컨텍스트); } 함수 RecurringTimerCallback(컨텍스트) { 로그('From RecurringTimerCallback: 타이머가 실행됨', 컨텍스트); /* * 여기서 모든 종류의 반복 작업을 수행하려면 문서에서 날짜_스탬프만 업데이트하세요. * 소스 버킷에 다시 기록됩니다(단, ID 앞에 흰색 접두사 "cur_"가 붙습니다). */ src_bkt["cur_" + 컨텍스트.id] = { "last_update": new 날짜() }; // 타이머 재장전 크리에이트 리커링 타이머({ "id": 컨텍스트.id, "모드": "via_callback" }) } 함수 온업데이트(doc, 메타) { // 일반적으로 관심 있는 돌연변이로 필터링합니다. 만약 (doc.유형 !== 'recurring_timer') 반환; 만약 (doc.활성 === false) { 만약 (취소 타이머(RecurringTimerCallback, 메타.id)) { 로그('온업데이트에서: 활성 타이머, doc.active 취소됨', doc.활성, 메타.id); } else { 로그('온업데이트에서: 취소할 활성 타이머 없음, doc.active', doc.활성, 메타.id); } } else { 로그('온업데이트에서: doc.active 만들기/ 덮어쓰기', doc.활성, 메타.id); 크리에이트 리커링 타이머({ "id": 메타.id, "모드": "via_onupdate" }); } } |
타이머는 일/주/년 단위로 생성할 수 있습니다.
유휴 상태인 이벤트 시스템에 성능에 부정적인 영향을 미치지 않으면서 타이머를 하나 또는 백만 개까지 만들 수 있습니다. 이 기능은 장기적인 알림 및 고객 재참여 프로그램을 위한 사용 사례를 열어줍니다.
6.5.X 릴리스에서는 유휴 시스템에서 수천 개의 타이머를 생성하면(예: 1시간 이상) 메타데이터 버킷 작업 수가 증가하여 성능에 영향을 미치고 결국 주어진 이벤트 함수에 대한 돌연변이를 차단할 수 있었습니다.[1]
취소 타이머() 작업을 하거나 기존 타이머를 참조로 덮어쓰면 Eventing "메타데이터" 버킷에 임시 문서가 생성되며, 결국 이러한 문서는 삭제됩니다.[2]
예시:
많은 이벤트 타이머(이 경우 50,000개)를 생성하고 미래(96시간까지)로 예약한 다음 전체 세트를 취소(또는 모두 콜백 루틴을 실행하도록 허용)하는 데모를 시연합니다. 타이머 콜백).
- 이벤트용 '소스' 버킷과 '메타데이터' 버킷을 만듭니다.
- 이 함수를 배포합니다(아래 코드).
- 소스 버킷에 우리가 살펴볼 데이터만 있는 문서를 만듭니다.
1KEY spawn_50k_timers::1 - 1~2분 후에 로그를 확인합니다.
- "spawn_50k_timers::1" 키를 사용하여 문서를 삭제합니다.
- 1~2분 후에 로그를 확인합니다.
- 이 기능을 배포 해제합니다.
50만 이벤트 타이머가 생성되고 (취소되지 않고) 실행되는 것을 확인합니다:
- 기능 변경 지연 분을 1로 편집합니다(4일을 기다리지 않으려는 경우).
- 수정된 함수를 배포합니다(아래 코드).
- 소스 버킷에서 KEY만 볼 수 있으므로 아무 데이터로나 문서를 만듭니다.
1KEY spawn_50k_timers::1 - 2분 후에 로그를 검사합니다.
- "spawn_50k_timers::1" 키를 사용하여 문서를 삭제합니다.
- 1~2분 후에 로그를 확인합니다.
- 이 기능을 배포 해제합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
함수 타이머 콜백(컨텍스트) { 만약 (컨텍스트.timer_num == 1 || 컨텍스트.timer_num == 50000) 로그('타이머콜백: 발사된 타이머 #', 컨텍스트.timer_num); /* * 몇 가지 조치를 취하십시오 ... */ } 함수 온업데이트(doc, 메타) { 만약 (메타.id != 'spawn_50k_timers::1') 반환; // 지금부터 96시간(4일) 후 타임스탬프 만들기 var 지연 분 = 60*96; var 미래 시간 = new 날짜(); 미래 시간.setMinutes(미래 시간.getMinutes() + 지연 분); // 50만 타이머 만들기 에 대한 (var i=1; i<= 50000; i++) { var timer_id = "tmr_" + i; 만약 (i == 1 || i == 50000) 로그('온업데이트: 타이머 # 생성', i, timer_id); 시도 { createTimer(타이머 콜백, 미래 시간, timer_id, { "docId": 메타.id, "timer_num": i}); } catch (e) { 로그('온업데이트: # 생성', i, " 오류 ", e); } } } 함수 OnDelete(메타, 옵션) { 만약 (메타.id != 'spawn_50k_timers::1') 반환; /* * 관련 제어 문서가 더 이상 없으므로 50만 타이머를 제거합니다. * * 취소 또는 덮어쓰기 시에는 다음과 같은 문서가 생성됩니다. * a) 타이머의 초기 발동 일정, b) 배포 해제 시 정리됩니다. * 기능을 사용하거나 c) 이벤트 서비스에 의한 게으른 클리닝 프로세스가 발생한 경우입니다. */ 에 대한 (var i=1; i<= 50000; i++) { var timer_id = "tmr_" + i; 만약 (i == 1 || i == 50000) 로그('온삭제: 타이머 지우기 # ', i, timer_id); 시도 { 취소 타이머(타이머 콜백, timer_id); } catch (e) { 로그('온삭제: 타이머 지우기 #', i, " 오류 ", e); } } } |
이제 이벤트 통계가 수명 주기 제어와 함께 배치됩니다.
이제 UI에서 4개의 주요 이벤트 통계가 각 함수 수명 주기 컨트롤과 함께 배치됩니다. 이러한 개선 사항으로 코딩 작업과 이벤트 함수를 진단하는 작업이 간소화되어 강력한 비즈니스 로직을 빠르게 만들 수 있습니다.
개발자나 관리자는 함수의 수명 주기 컨트롤에서 벗어나지 않고도 함수가 잘못 작동하는 것을 즉시 확인할 수 있습니다.
예시:
- 이벤트용 '소스' 버킷과 '메타데이터' 버킷을 만듭니다.
- 소스 버킷에 KEY와 DATA를 몇 개 문서화하세요.
- 수정된 함수(아래 코드)를 배포하면 변수 앞에 var를 넣는 것을 잊어버리는 구문 오류가 발생합니다.
1 2 3 4 5 |
함수 온업데이트(doc, 메타) { 로그('docId', 메타.id); // 'var'가 누락된 오류입니다. a = 2; } |
- 이벤트 기능이 배포되면 개발자에게 문제가 발생했다는 즉각적인 피드백이 제공됩니다.
- 사용자는 피드백(예: '빨간색' 실패)에 응답하고 오류의 원인을 찾기 위해 함수를 검사할 수 있습니다.
- 이 이벤트 함수를 배포 해제합니다.
- 이 경우 오류를 수정하여 4줄을 만듭니다: "var a=2;".
- 이 이벤트 함수를 다시 배포합니다.
- 코드가 수정되면 개발자는 이제 성공 카운터가 증가함에 따라 올바른 동작과 진행 상황을 확인할 수 있습니다.
이제 온삭제 핸들러가 삭제 또는 만료를 표시합니다.
OnDelete 핸들러는 이제 새로운 매개변수 "옵션"을 통해 문서가 삭제되었는지 만료되었는지를 표시합니다. 자주 요청되는 이 기능을 통해 삭제 유형에 따라 다른 로직을 실행할 수 있습니다.
예시:
- 이벤트용 '소스' 버킷과 '메타데이터' 버킷을 만듭니다.
- 이 함수를 배포합니다(아래 코드).
- KEY만 보므로 소스 버킷에 DATA가 있는 문서를 만듭니다.
1KEY doc_to_delete::1 - 몇 초 후 로그 검사
- "doc_to_delete::1" 키를 사용하여 문서를 삭제합니다.
- 1분 후 로그 검사
- 이 기능 배포 취소
1 2 3 4 5 6 7 8 9 10 11 12 13 |
함수 OnDelete(메타, 옵션) { 만약 (옵션.만료됨) { 로그("문서 만료:",메타.id); /* * 조치를 취하십시오 ... */ } else { 로그("문서 삭제됨:",메타.id); /* * 다른 조치를 취하십시오 ... */ } } |
Couchbase Server 6.6 리소스 살펴보기
참조
- 카우치베이스 이벤트 문서:
https://docs.couchbase.com/server/current/eventing/eventing-overview.html - 카우치베이스 이벤트 예시:
https://docs.couchbase.com/server/current/eventing/eventing-examples.html - 카우치베이스 서버 6.6의 새로운 기능:
https://docs.couchbase.com/server/6.6/introduction/whats-new.html - 이벤트에 대한 카우치베이스 블로그:
https://www.couchbase.com/blog/tag/eventing/
6.6의 기능이 마음에 드셨는지, 앞으로 비즈니스에 어떤 도움이 될지 여러분의 의견을 듣고 싶습니다. 댓글을 통해 의견을 공유해 주세요. 포럼.
각주
[1] 심각도는 다음과 같은 요소에 따라 결정됩니다. a) 활성 타이머를 보유하고 있는 vBucket의 수입니다. 따라서 향후 타이머가 몇 개만 있는 경우 문제가 눈에 띄지 않거나 구체화되지 않을 수 있습니다. 그리고 b) 이벤트 타이머가 최근에 vBucket에서 실행되었는지 여부(기능별로 지정된 vBucket에 대한 문제를 해결합니다). 따라서 단기 타이머 활동이 많은 6.5 시스템에서는 타이머가 먼 미래로 예약되어 있어도 이 문제가 발생하지 않습니다. 6.6에서는 이 문제가 발생하지 않습니다.
[2] 취소 타이머() 연산이나 참조로 기존 타이머를 덮어쓰는 경우, Eventing "메타데이터" 버킷에 임시 문서가 생성되며, 이는 a) 취소된(또는 덮어쓴) 타이머의 초기 발동 일정 또는 b) 함수 배포 해제 시점에 정리됩니다. 이 동작은 예약된 시간에 실행되는 타이머와는 달리 타이머가 실행되는 즉시 관련된 모든 Eventing 메타데이터가 Eventing "메타데이터" 버킷에서 정리됩니다.