2014-01-21 3 views
0

내 서버 구현에서 GAE Search API를 사용 중이며 이상하고 문서화되지 않은 동작이 발생했습니다. 때때로 색인 (Index.put())에 추가 된 새 문서는 직선적으로 수행되는 검색 (Index.search())으로 검색되지 않습니다. 때로는 사용 가능할 때까지 1 분 정도 걸립니다.GAE - 검색 API - 검색에서 새로 추가 된 문서가 반환되지 않습니다.

궁극적 인 일관성 문제처럼 보이지만 documents에서 검색 API와 관련하여 언급 한 내용을 찾을 수 없습니다. 낯선 사람은이 시간 동안이 문서를 사용할 수 없다는 사실을 알았습니다. 관리 콘솔에서 똑같은 쿼리를 수행하고 예상되는 결과를 얻을 수 있습니다.

누구나 거래 내용을 알고 있습니다. 이것은 정상적인 행동입니까? 그렇다면 검색 될 때까지 새로 추가 된 문서의 최대 시간은 얼마입니까? 그리고 왜 이것이 문서화되지 않았습니까? 이 심각하게 내 응용 프로그램의 기능에 영향을 미칩니다.

감사합니다.

+0

이 동작은 google에 의해 인정되었습니다. [link] (https://code.google.com/p/googleappengine/issues/detail?id=10521&q=Fulltextsearch&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log) – AsafK

답변

0

예 일관된 결과 (Brewer's keynote PDF)는 검색에도 적용됩니다. 문서화 된 최대 수렴 시간은 아마도 균형을 이루지 못할 경우 비생산적으로 실행될 수 있음을 의미합니다. 타이밍 보장이 없다면, GAE는 앞으로도 발전하고 다르게 행동 할 것입니다. 일부 GAE 사용자가 특정 애플리케이션 타이밍 요구 사항에 맞게 CAP 매개 변수를 조정하기 위해 Riak으로 마이그레이션한다고 들었습니다.

다른 시간대에 다른 하위 시스템에 나타나는 최신 쓰기의 증상은 분산 캐시를 제안합니다. 가장 좋은 전략은 타이밍에 덜 의존하는 기능을 재 설계하는 것입니다. 가장 확장 성이 뛰어난 응용 프로그램이이를 수행했습니다.

+0

을 참조하십시오. 우선 답에 감사드립니다. 둘째, "GAE는 미래에도 다른 방식으로 진화하고 다르게 행동 할 수 있습니다."라는 말은 문서화되지 않은 행동의 이유입니다. 그러나 이것은 제품이 제공하는 모든 서비스에 해당됩니다. Google과 같은 PaaS 제공 업체는 이러한 제한 사항이 변경되면 서비스의 제한 사항을 게시하고 다시 게시해야 할 의무가 있다고 생각합니다 (다른 서비스와 함께하는 것처럼). 좋아, 불평 때문에 (정당화 된). 다음 댓글에서 계속 ... – AsafK

+0

나는 다른 플랫폼으로 마이그레이션하기에는 너무 늦었다 고 생각하고 재 설계와 관련하여 내 요구 사항을 간단히 설명하겠습니다. 내 앱을 사용하면 사용자가지도에 관심 장소를 동적으로 추가 할 수 있습니다. 사용자가 추가 한 사용자는 검색을 수행하는 즉시 보게됩니다. 아마 알겠지만이 검색은 Search API를 사용하여 수행됩니다.내가 생각할 수있는 유일한 해결책은 그의 POI가 검색을 위해 잠시 시간이 걸릴 것이라는 말을하는 해설자 메시지를 쓰는 것입니다. 뭐라 말합니까? – AsafK

+0

요구 사항에 대한 추가 정보를 통해 문제의 문제점을보다 명확하게 설명 할 수 있습니다. 사용자가 추가 한 모든 항목을 즉시 볼 수 있어야합니다. 또한 저에게 다른 대답을위한 아이디어를주었습니다. 이제는 글쓰기를 시작하겠습니다 ... –

1

새로 추가 된 모든 관심 지점이 사용자의지도에 나타나야한다는 것은 논리적이고 절대적으로 중요합니다. 그러나 검색 서비스는 예측할 수없는 시간 동안 새로운 추가 기능을 계속 반환하지 않을 것입니다. 나는 서버 쪽과 클라이언트 쪽의 두 가지 전략을 고려할 것이며, 두 가지 전략을 모두 사용해 보겠다. 그러나 둘 다 간단하지 않습니다.

서버에서 검색 서비스를 확장하거나 직접 개발할 사용자 지정 검색으로 바꿀 수 있습니다. 기본적으로 MySQL 인 검색 데이터를 Google Cloud SQL에 저장하십시오. 이것은 결과 일관성에 영향을받지 않는 단일 인스턴스이기 때문에 항상 그것에 기록 된 것을 즉시 반환합니다.

클라이언트에서 최근에 추가 된 모든 관심 지점을 캐시 할 수 있습니다. 그런 다음 서버에서 데이터를 요청할 때도 로컬 캐시를 쿼리합니다. 서버가 반환하는 것과 중복되는 로컬 결과를 삭제하십시오. 다른 사용자는 결국이 사용자가 즉시 볼 수있는 것을 볼 수도 있습니다.

+0

그처럼 수치스러운 해결책을 찾기 위해 나는 정착해야합니다. 실제로 나는이 문제에 대한 해결 방법으로 고객의 2 번째 제안 (클라이언트)을 이미 생각했으며, NoSQL DB의 확장 성과 가용성 이점을 잃어버린 첫 번째 제품보다 더 선호한다고 생각합니다. 난 정말 내 질문에 공식적인 벤치 마크 답변을 제공하지만 당신이 그것에 넣어 노력에 대한 upvote 것입니다 귀하의 답변을 선택 실 거예요. 고마워요. – AsafK

+0

피드백에 감사드립니다. 나는 클라이언트에 해결 방법을 추가하는 것이 더 낫다는 것에 동의한다. –