Node.js + 카우치베이스 3.0 + SDK 2.0 + 부트스트랩
요구 사항
카우치베이스 커넥트 컨퍼런스를 위한 제품 데모를 구축할 때 다음과 같은 요구사항이 설정되었습니다:
[1] 청중이 참여하는 라이브 데모여야 하며, 미리 만들어진 동영상이나 파워포인트 프레젠테이션만으로는 안 됩니다. 상당한 위험이 따르는 높은 기준이 설정되어 있습니다.
[2] Couchbase 3.0의 성능을 입증하고 서로 다른 데이터센터의 클러스터 간 데이터의 실시간 일관성(XDCR)을 보여줘야 합니다.
[3] 민첩해야 하며, 새로운 Couchbase 2.0 SDK의 강력한 기능을 활용해야 합니다.
[4] 이 애플리케이션은 4일 만에 코드가 완성되어야 Couchbase를 사용한 개발이 애자일 엔터프라이즈에 이상적이라는 점을 강조할 수 있습니다.
[5] 이 작업을 어떻게 수행했는지 세상에 알리고 소스 코드를 공개하여 이를 증명하세요.
두 개의 서로 다른 데이터센터에 있는 두 개의 웹 서버에 분산되어 두 개의 서로 다른 클러스터와 통신하는 경매 애플리케이션이 목표를 달성할 수 있다고 결정했습니다. 솔트레이크시티 클러스터와 런던 클러스터는 XDCR을 사용하여 양방향 복제를 통해 일관성을 유지합니다. Couchbase 3.0의 새로운 DCP 프로토콜은 일관성이 유선 속도에 의해서만 제한된다는 것을 의미합니다. 각 데이터센터의 애플리케이션 서버는 node.js를 실행하여 각 지역의 트래픽을 처리합니다. 코드는 다음에서 다운로드할 수 있습니다. 카우치바스랩 리포지토리를 깃허브에 저장하세요. **
애플리케이션 디자인
다음과 더불어 node.js 사용 Express와 카우치베이스 2.0 SDK에서는 프런트엔드 개발에 부트스트랩이 사용되었습니다. 2.0 SDK는 괄목할 만한 성과이며, 개발을 간소화하는 중요한 새로운 발전이 포함되어 있습니다. 2.0 SDK에 대한 정보와 Couchbase가 시장에서 개발 리더십을 계속 확장하는 이유는 다음에서 확인할 수 있습니다. 개발자 포털.
세션 관리
재미로 하는 경매에는 인증이 필요하지 않지만, 사용자와 동시 세션을 식별하는 수단은 여전히 필요합니다. 간단한 로그인 양식은 각 세션마다 사용자 ID가 포함된 쿠키를 저장합니다. 로그인 기능은 세션 쿠키를 생성하기 전에 사용자가 존재하는지, 필터링된 단어 위반이 있는지 확인합니다.
filterScan(newUser, 함수 (filtcb) {
만약 (filtcb) {
db.읽기(newUser, 함수 (err, 사용자) {
만약 (err && err.코드 === 카우치베이스.오류.keyNotFound) {
res.쿠키('user', newUser);
db.업서트(newUser, 0, 함수 (err, res) {
만약 (err) {
콘솔.로그("로그인:오류 생성:" + err);
완료("로그인:오류 생성:" + err, null);
반환;
}
콘솔.로그("LOGIN:" + newUser + ":성공");
완료(null, "LOGIN:" + newUser + ":성공");
반환;
});
} else {
만약 (사용자) {
콘솔.로그("로그인:오류:" + newUser + " 존재");
완료("로그인:오류:" + newUser + "존재합니다 - 다른 사용자 이름을 선택하세요", null);
반환;
}
콘솔.로그("로그인:오류:종료:" + err);
완료("로그인:오류" + err, null);
반환;
}
});
} else {
콘솔.로그("로그인:오류:단어 위반");
완료("로그인:오류, 사용자 이름에 금지 용어", null);
반환;
}
});
}
그런 다음 아주 작은 '미들웨어' 기능이 수신 요청을 라우팅하기 전에 사용자가 세션을 설정했는지 확인합니다.
만약 (req.쿠키.사용자) {
반환 다음();
}
res.리디렉션(‘/’);
}
추가 '미들웨어' 기능은 카운트다운이 설정되어 있는지 또는 이 경매가 마감되었는지 확인합니다.
db.읽기('state',함수(err,완료){
만약(완료.값.활성) {
반환 다음();
}else{
만약(완료.값.카운트다운 != "none")
{
res.렌더링('countdown.jade');
}else {
db.읽기('bike', 함수 (err, cb) {
res.렌더링('winner', {사용자: req.쿠키.사용자, 금액: cb.값.입찰, 높은: cb.값.높은});
반환;
});
}
}
});
}
사용자 상호 작용
app.js 파일은 애플리케이션의 작동 방식을 제어합니다. 모든 경로는 특정 파일의 routes.js 객체에 정의됩니다. 애플리케이션 객체는 라우트 객체로 전달됩니다. 이는 미들웨어 기능을 더 쉽게 사용할 수 있도록 하는 스타일 기본 설정입니다(위의 예에서 사용된 것처럼). REST API는 간단합니다: 다음과 같은 메서드가 노출됩니다:
POST api/경매/로그인 [각 고유 사용자에 대한 세션, 쿠키 설정]
GET API/경매/로그인 [안전 방법, 페이지 새로 고침의 경우]
GET api/auction/load [경매 페이지 로드]
POST api/경매/입찰 [입찰가 설정, 유효성 검사 포함]
GET API/경매/입찰 [안전 방법, 페이지 새로 고침 시]
GET api/auction/get [현재 최고가 입찰자 가져오기]
POST api/auction/open/:password [경매 재설정, 버킷 플러시, 경매를 열도록 설정]
POST api/auction/close/:password [경매를 마감으로 설정]
POST api/auction/view/build [입찰 내역 조회에 사용할 뷰 설정]
GET api/auction/view/get [입찰 내역 보기 가져오기]
GET API/경매/카운트다운/get [경매 '시작'과 지금 사이의 시간(초) 가져오기]
POST api/auction/countdown/set/:yyyy/:mm/:dd/:hh [경매 시작 날짜 설정]
POST api/auction/countdown/del/:password [경매 카운트다운을 없음으로 설정하고 경매를 라이브로 설정]
동적 업데이트
기조 데모에서는 여러 사용자가 서로 다른 두 개의 클러스터에 동시에 입찰하며, 모든 업데이트는 현재 경매 페이지를 보고 있는 다른 사용자에게 즉시 전파되어야 합니다. 이를 수행하는 방법에는 여러 가지가 있으며, 각 방법에는 장단점이 있습니다. 이 특정 애플리케이션은 옥 템플릿을 통해 경매 페이지를 로드합니다. jade 템플릿은 jquery ajax 폴링 루프를 인스턴스화합니다. 이 루프는 /api/auction/get REST 엔드포인트를 매초 두 번 폴링하여 최고 입찰자를 결정합니다.
setInterval(함수 () {
pollBid()
}, 500);
함수 pollBid() {
$.get('/api/auction/get', 함수 (cb) {
만약 (cb) {
$("#bid").html(“$” + cb.입찰);
$("#high").html(cb.높은);
}
else {
}
});
}
관리
데모 중에 curl 명령을 사용하여 경매 상태를 설정하기 위해 다음 메서드가 호출됩니다. 데모 순서는 경매를 재설정하고, 생방송 날짜를 설정하고, 키노트 시작 시 경매를 생방송으로 설정하고, 경매를 종료하는 순서로 진행됩니다.
curl -X POST http://localhost:3001/api/auction/open/un5ecure_pa55word
curl -X POST http://localhost:3001/api/countdown/set/2014/10/06/13
curl -X POST http://localhost:3001/api/countdown/del/un5ecure_pa55word
curl -X POST http://localhost:3001/api/auction/close/un5ecure_pa55word
출처 및 고려 사항
이 앱의 기능 대부분은 하드 코딩되어 있으며 이 기조 데모 사용 사례에 한정되어 있습니다. 데이터 모델은 이 사용 사례에 한정되어 있으며 개념 증명으로만 적용 가능합니다. 이 사용 사례에는 보안 액세스 또는 인증이 없습니다. XDCR로 연결된 다른 클러스터에 배포할 때는 경매를 '초기화'하기 위해 추가적인 관리가 필요합니다. 현재 XDCR에 참여 중인 버킷은 "플러시"할 수 없습니다.
** 면책 조항: Couchbase Labs는 연구 및 개발 목적으로만 실험용 코드를 제공합니다. Couchbase Labs의 코드 및 애플리케이션은 Couchbase 지원 계약에 따라 지원되지 않으며 어떠한 종류의 보증도 없이 있는 그대로 제공됩니다.
Todd, 게시물과 데모에 감사드립니다. 초당 3M의 성능을 달성하기 위해 AWS 버전에서 사용한 클러스터 구성을 공유해 주시겠어요? 즉, 어떤 종류의 서버 마력이 필요했나요?
TIA,
Dave
안녕하세요 데이브, 이건 c3.4xlarge 인스턴스입니다. 카우치베이스 서버 3.0은 기본 설정으로 설치되었습니다.