2012-09-11 2 views
2

최근에 HRD와 NDB에 대한 많은 문서를 읽었지만 아직 NDB가 어떻게 캐시하는지에 대한 의문점이 있습니다.높은 복제 Datastore + NDB로 쓰기/읽기

예 케이스 :

는 사용자 데이터를 기록하고 앱이 쓰기 후 즉시 인출 할 필요가있는 경우를 상상해보십시오. 예 : 사용자는 "그룹"(Facebook/Linkedin 그룹과 유사)을 만들고 그룹을 만든 직후 그룹으로 리디렉션됩니다. (현재, 나는 그것을 조상을 지정하지 않고 그룹을 만드는거야)

결과 :

로컬 기능의 종류를 테스트 할 때 즉시 새로 페치 (활성화 높은 복제를 가짐) 생성 된 그룹이 실패합니다. NoneType이 리턴됩니다.

질문 :

내가 NDB 캐싱이 알아서는 안하지만, 더 높은 쓰기 대기 시간이 있음을 이해하고, 높은 복제 문서와 구글 IO 비디오를 통해 간 데? 나는. 쓰기가 캐시되고 비동기 적으로 실제로 디스크에 쓰여 지므로 즉시 읽기는 캐시에서 읽는 것이므로 아무런 문제가 없어야합니다. 다른 설정을 적용해야합니까?

답변

2

쿼리가 "결국 일관성이있는"HRD 기능을 사용하고 있는지 확인하십시오. NDB의 캐싱은이 동작과 관련이 없습니다.

2

리디렉션 때문에 NoneType이 반환 된 것으로 판단됩니다.

https://developers.google.com/appengine/docs/python/ndb/cache#incontext

은에 컨텍스트 캐시는 단일 들어오는 HTTP 요청의 기간 동안 지속되고 해당 요청을 처리하는 코드를 "볼 수"입니다. 그것은 빠릅니다. 이 캐시는 메모리에 있습니다. NDB 함수가 Datastore에 쓰면 컨텍스트 캐시에도 기록됩니다. NDB 함수가 엔티티를 읽을 때 먼저 컨텍스트 내 캐시를 검사합니다. 해당 엔티티가 발견되면 Datastore 상호 작용이 발생하지 않습니다. 쿼리는 모든 캐시에서 값을 조회하지 않습니다. 그러나 캐시 정책이 그렇게 말하면 쿼리 결과는 컨텍스트 캐시에 다시 쓰여지지만 Memcache에는 쓰지 않습니다.

그래서 당신은 캐시에 값을 쓰기를 리디렉션 및 리디렉션에 대한 HTTP 요청이 다른 하나입니다 그래서 캐시가 다른 때문에 그 실패 읽습니다.

여기 내 지식의 한계에 도달했지만 처음에는 완료/성공시 트랜잭션에서 생성을 시도하고 리디렉션하는 것이 좋습니다. 당신이 데이터 저장소에 그룹 모델을 넣을 때

https://developers.google.com/appengine/docs/python/ndb/transactions

또한 당신은 키를 다시 얻을 것이다. 해당 키를 (예 : urlsafe를 통해) 리디렉션에 전달하면 명시 적 키를 가지고있는 것처럼 데이터를 검색 할 수 있습니까? 결국 데이터 저장소에 없으면 키를 가질 수 없습니다.

또한 프로덕션 서버에서 시도하는 것이 좋습니다. 때로는 동작이 로컬 및 프로덕션 환경에서 매우 다를 수 있습니다.

+0

감사합니다. 컨텍스트 캐싱을 사용하는 HTTP 요청 문제가 적합합니다. 그러나 트랜잭션 작업으로 변환해도 문제가 해결되지 않습니다. 내가 틀렸다면 정정하십시오. 그러나 Datastore는 디스크에 쓰기 전에 키를 반환합니다. 이것이 키를 얻었을지라도, 그것을 얻을 때 NoneType을 반환하는 이유입니다. 해결 방법은 몇 초 동안 memcache에 대한 것일 수 있습니다 ... 좋은 해결책인가요? –

+0

읽기 : https://developers.google.com/appengine/docs/python/datastore/overview#Datastore_Writes_and_Data_Visibility 데이터 저장소가 가져오고 상위 쿼리가 실행되기 전에 해결되지 않은 수정 사항이 적용되므로 이러한 작업은 항상 모든 이전의 성공적인 트랜잭션. 이것은 get 연산 (키에 의해 업데이트 된 엔티티를 찾음)이 해당 엔티티의 최신 버전을 볼 수 있음을 의미합니다. " 그래서 내가 말할 수있는 한, put에서 생성 된 키로 get을 한 후에는 noneType을 얻지 않아야한다고 말할 수 있습니다. –

+0

감사합니다. 내 생각에 "일관된"GAE는 시스템 주변에 부분적으로 업데이트 된 데이터가 없다는 것을 의미한다고 생각합니다. 나는 이것이 열쇠가 반환 될 때 기록된다는 것을 의미하지는 않는다. 좀 더 테스트를했는데 값을 업데이트하고 페이지로 리디렉션하지 않으면 즉시 컨텍스트 캐시에서 오는 새 값을 봅니다. 그러나 업데이트하고 리디렉션하면 첫 페이지로드시 값이 업데이트되지 않습니다 (언급 한 HTTP 요청 문제로 인해). 내가 다시로드 할 때만 (디스크에 쓸 시간이 있음) 업데이트 된 값을 볼 수 있습니까? –