2014-12-24 2 views
1

GAE 웹 응용 프로그램을 개발 중이며 조상 관계가없는 두 개의 엔터티 인스턴스간에 연결을 만들고 제거해야합니다 (동일한 인스턴스가 다를 수 있음을 고려하십시오) 한 번 생성 된 조상의 관계는 제거 할 수 없습니다.) 나는 '결과 일관성'정책을 경험했는데, 이는 내 웹 페이지의 데이터가 내가 만들고 삭제하는 관계와 일관되게 새로 고침되지 않음을 의미합니다. 그러나 put() 메서드를 두 번 실행하면 일관성이 강제적 인 것으로 보입니다.Google App Engine Datastore : 최종 일관성 처리

이것은 "새로운 업데이트가 제공되지 않았습니다 ..."라는 데이터의 결과 일관성 정의와 일치합니다. 데이터는 결국 일관성이 있으며, 다른 업데이트 (실제로 동일한 두 번) 시스템이 일관성을 강요한다고 생각합니다.

맞습니까? 그것을하는 다른 더 우아한 방법이 있습니까?

업데이트 :

내가 A 형 개체의 목록을 생각해 내 AIM, 그들이 실제로 무엇을 나타내는 중요하지 않습니다, 이제 그들은 내가 목록을 가지고 내 사업 의 주요 기관을 대표하는 가정 해 봅시다 A 유형의 엔티티가 의지 할 수있는 서비스를 나타내는 B 유형의 다른 엔티티 는 서비스 (B)가 많은 기관에서 사용할 수 있도록 많은 관계로 많은 인 엔티티 a가 b 형 B의 다양한 서비스가 제공 될 수있는 유형의

나는 나를 만들 수 있도록 웹 페이지를 이러한 관계 (클라이언트 측에서 Jquery Ajax 콜백을 사용하는 Jinja2 템플릿과 서버 측에서 데이터 저장소를 사용하는 webapp2 python 요청 처리기). 관계가 데이터 저장소에서 제거되면 엔티티에 대한 다른 쿼리를 만들고 관련이있는 b 키의 목록을 묘사하여 데이터를 새로 고칩니다. 이 경우 여전히 a와 관련된 b 키 목록에서 제거 된 b.key가 표시됩니다. 나는 내가 기대하는 바가 아니다.

UPDATE : 일부 CODE 여기

내가 제거하기 위해 사용하는 코드 내가 관계 여기

   a.services.append(b.key); 
       b.servedEntities.append(a.key); 
       a.put() 
       b.put() 

을 만드는 데 사용하는 코드 모델 여기

class A(ndb.Model): 
    name = ndb.StringProperty() 
    services = ndb.KeyProperty(repeated=True) 

class B(ndb.Model): 
    name = ndb.StringProperty() 
    servedEntities = ndb.KeyProperty(repeated=True) 

임 관계

   a.services.remove(b.key); 
       b.servedEntities.remove(a.key); 
       a.put() 
       b.put() 

난 아직도 b.key이 a.services

+0

두 번 넣기를하면 무용지물이됩니다. 당신은 그들이 왜 일관성을 유지할 필요가 있는지 설명 할 수 있습니까? –

+0

이 업데이트되었습니다. 나는 분명히 대답했으면 좋겠다. – lowcoupling

+0

문제를 나타내는 가능한 최소한의 코드 샘플을 포함하면 도움이 될 것입니다. –

답변

1

대답에 나열된 볼 수있는 데이터 저장소에서 다시 검색 나는 경우 관계 제거한 후 A와 B (거기 수 없습니다) 사이에 조상 관계가 없습니다 질문에 대한 답변은 다음과 같습니다.

데이터 저장소에서 관계가 제거되면 데이터에 새로 입력 된 을 새로 고칩니다.

왜 새 쿼리가 필요합니까?

사용자가 서비스 x, y 및 z에 가입했다고 가정 해 봅시다.이제 사용자는 목록에서 서비스 z를 삭제하라는 메시지를 표시합니다. 데이터 저장소로 이동하여 필요한 변경 작업을 수행합니다. 그러나 반환 된 엔티티 중 z가 표시 될 수있는 새 쿼리를 실행하는 대신 클라이언트 측의 사용자 엔티티에서 z를 제거하고 이에 따라 UI를 업데이트하면됩니다.

이것은 분명히 단순화 된 예입니다. 더 복잡한 유스 케이스가있는 학교 스케줄링 앱을 작성했을 때 비슷한 도전 과제에 직면했습니다. 한 번의 변경으로 인해 선택한 기간의 많은 항목에 영향을 미칠 수 있습니다 (예 : "분기마다 끝날 때마다 수업 일지를 예약"). 그래서 나는 새로운 쿼리를 실행하여 일정보기를 새로 고침하기를 원했습니다. 분명히, 때로는 수십 개의 엔티티를 만들어야한다는 사실에 힘 입어 궁극적 인 일관성 문제가 발생했습니다. 그런 다음 새 쿼리를 실행하지 않고보기를 새로 고치는 데 필요한 모든 데이터가 이미 있음을 알게되었습니다. 코드가 좀 더 많지만 깨끗하고 안정적인 솔루션입니다.

+0

그래도 사용자가 페이지를 새로 고침하면 이전 항목이 다시 돌아 오는 것을 볼 수 있습니다. – lowcoupling

+0

사용자 손가락의 속도와 네트워크 대기 시간을 고려하여 사용자가 어떻게 든 새로 고침 버튼을 누르지 않으면 새로 고침 된 페이지가 밀리 초 이내에 저장 버튼을 누르십시오. 그 빈도는 얼마나 자주 발생합니까? 이 가능성을 고려하여 쓰기 비용을 두 배로 늘리시겠습니까? (내 경험상, 궁극적 인 일관성은 여러 엔터티가 관련된 경우조차도 스스로를 해결하는 데 거의 1 초 이상 걸리지 않습니다.) –

+0

@lowcoupling 이것은 ajax-y 앱이므로 새로 고침하는 것이 일반적이지 않습니다. 이 문제를 최소화하기 위해 [memcache] [1]를 활용할 수도 있습니다. 그러나 결국, 이런 종류의 일관성이 필요하다면, 1) 엔티티 그룹 또는 데이터 스토어의 강력하고 일관된 기능을 사용하도록 스키마를 재구성하거나 2) 앱 엔진을 사용하지 말아야합니다. https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.kzvtug7i4vlw – Chris

관련 문제