2010-07-14 4 views
1

Heroku의 레일즈 앱에 페이스 북과 같은 자동 완성 기능을 추가하고 싶었 기 때문에 Node.js에 작성했습니다. 동시성 요구 사항. 검색은 먼저 Mongo에서 친구의 목록 (우리 사이트의 친구들뿐 아니라 모든 트위터 친구를 포함하는 ID)을 가져온 다음 해당 목록에서 사용자를 검색 한 다음 해당 사용자와 일치하는 다른 사용자를 다시 검색합니다 친구 검색에서 반환 된 결과에 포함되지 않았습니다.Node.js/Express.js의 DB (MongoDB) 캐싱 어레이

이것은 처음에는 (~ 150ms) 매우 빠르지 만 더 많은 친구가있는 사용자의 경우 (위에서 말하면 총 100 개) 친구 배열로드가 병목 현상을 일으키고 최대 검색 속도가 선형 적으로 느려졌습니다 1,000 명의 친구가있는 사용자의 경우 약 1500ms (자동 완성 친구 검색을 지원하는 최대 수)입니다.

문제는 Node.js와 Express (Sinatra와 유사한 웹 프레임 워크)가 완전히 새롭기 때문에 친구 배열을 캐시하는 방법을 모르므로 한 번로드하면됩니다 (이상적으로는 기억). Heroku의 Rails에서 단순히 배열을 Memcache에로드하는 것이지만 Node/Express에서 Memcache를 구성하는 방법을 알지 못합니다. Heroku에서 지원되는 경우는 말할 것도 없습니다.

아이디어가 있으십니까?

답변

8

mongodb가 일치 작업을 수행 할 장소라고 생각합니다. 모든 결과를 자신의 코드로 다시 가져오고 배열에서 직접 일치 시키려고하는 것 같습니다. mongodb에게 당신에게 가장 잘 맞는 10 가지 결과를 걸러 내고 그 결과를 고객에게 직접 보내달라고 요청하는 것이 더 빠를 것입니다.

데이터베이스에 대한 가장 중요한 부분은 이러한 필터링을 사용자와 신속하게 수행 할 수 있다는 것입니다. 또한 다른 솔루션보다 확장 성이 좋습니다. 데이터베이스를 신뢰하십시오. mongodb의 전체적인 점은 쿼리가 엄청나게 빠르며 memcache의 속도에 가깝습니다. 당신은 그 질문에 올바른 질문을 할 필요가 있습니다. 그리고 당신은 데이터베이스를 열심히 망치질 수 있다고 상상해보십시오. 그러나 당신이 사용하고자하는 정확한 일치 항목만을 요청하십시오.

아마 이런 일이 (난 그냥 아이디어를 표시하려면이를 만든) 존들은 SMI ... 를 일치 시키려면 :

friendIdList // 당신의 응용 프로그램에서 ID의 간단한 배열로 가정

var matchFriends = db.people.find ({person_id : {$ in : friendIdList}, 이름 :/john smi. */i}) .sort ({name : 1}) .limit (10);

는 정규 표현식에 MongoDB를 워드 프로세서가이 도움이

희망, 난 그냥 MongoDB에 대해이 아니라 전문가 배우고 쿼리를 참조하십시오, 그러나 이것은 내가 다른 데이터베이스

6

내가 Node.js를 또는 익스프레스에 대해 거의 알고있다 (또한 나는 친구 식별자를 포함하여 모든 쿼리에 대한 다중 키 색인 해요, 주). 그러나 클라이언트 측에서이 작업을 수행하려고한다고 말할 수 있습니다. (: 클라이언트의 쿠키 목록을 쿠키로 쿠키를 검색하고을 검색)

FB의 구현을 살펴보면 적어도 몇 달 전이었습니다.

0

내가 제안에 문제를 접근 할 방법입니다 , 이름을 모두 클라이언트 측에 미리로드하지 않으려면 첫 번째 문자가 입력 된 후 검색을 수행하는 것이 좋습니다. 이렇게하면 분수로 검색해야하는 이름 수가 줄어들고 해당 요청이 DB에 제출됩니다.그런 다음 결과를 알파벳순으로 반환 할 수 있습니다. 한 번 더 문자를 입력하면 정렬하지 않고 필터링 할 수 있습니다. 사용자가 수천 명의 "David Smith"라는 친구가없는 한 모든 요청은 150ms 목표를 충족해야합니다.