2013-07-16 1 views
3

우리는 애플리케이션 엔진에 복잡한 개체를 삭제하는 트랜잭션을 시작하는 경우와 객체, 우리는 문제가에 삭제해야 첨부 된 일부 BLOB 참조를 가지고있다. blob을 삭제하면 트랜잭션이 실패 할 수 있지만 blob은 사라집니다. blobstore가 독립적으로 작동하기 때문에 (트랜잭션 개념에 위배됩니다).BLOBstore 삭제 작업을 ndb로 안전하게 처리하려면 어떻게해야합니까?

이제 우리는이 멋진, 새로운 NDB 느릅 나무는 문제를 해결할 수있는 문서화 된 API (?)없이 상황에 맞는 캐시를 가지고있다.

toolchest을 :

  • ndb.get_context()

    def delete_blobs_call_on_commit(): 
        ndb_context = ndb.get_context() 
        blobstore.delete(ndb_context.list_of_blobkeys_to_delete) 
        # OR: taskqueue.add(url+ndb_context.list_of_blobkeys_to_delete) 
    

작업

  • ndb_context.call_on_commit (delete_blobs_call_on_commit) (NDB의 함수 참조 문서화)에 연결을 blobkeys 컨텍스트 개체에 대한 트랜잭션 중에 삭제하고 트랜잭션 후에 삭제하십시오.

    업데이트 : call_on_commit() 데이터베이스 작업 (즉 blobstore.delete을 포함 할 수 있지만 시도하지 않은)을 허용하지 않습니다와 BadRequestError가 발생합니다 : 완성 된 트랜잭션에 새로운 작업을 시작할 수 없습니다, 그래서이 유일한 해결책 수도 정말로 작업 대기열이됩니다.

    업데이트 : call_on_commit()에 등록 된 함수에서 @ ndb.non_transactional 데코레이터로 함수를 호출 할 수 있습니다. 따라서 커밋 성공시 BLOB를 삭제하고 예외가 없으면 고아가되지 않기를 바랍니다.

    질문 : 어떻게 안전하게 상황에 맞는 캐시를 사용하는? 얼룩 삭제 문제는 어떻게 해결 했습니까? 당신이 거래에서 사용할 수있는 단지 있도록

  • +0

    어떻게이 문제를 해결할 것인가? blobkey의 삭제가 여전히 실패 할 수 있으며 이제는 고아 BLOB가 있습니다.두 가지 삭제를 모두 추적하고 작업에서 실행하는 롤 포워드 트랜잭션 모델을 사용해보십시오. 작업은 모든 것이 삭제되었음을 확인한 다음 자체를 정리합니다. 어느 시점에서 실패하면 스위퍼는 앞으로 나가고 모든 엔티티가 사라질 때까지 재 시도 할 수 있습니다. 그냥 제안. –

    +0

    모든 BLOB 삭제를 작업 대기열로 푸시하고 트랜잭션이 실패 할 경우 작업을 삭제하는 것을 고려했지만 이는 불편합니다. delete_blobs_call_on_commit()은 blob을 직접 지우지 않고 여전히 작업 대기열을 사용할 수 있지만, 고아가 몇 개인 경우 허용 가능하다고 생각했습니다. blobstore의 성공률이 99.9 %이면 괜찮을 수 있습니다. 주로이 질문은 롤 포워드 데이터를 수집하는 것을 다룹니다. – cat

    +1

    이 기사를 읽었습니까? http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine –

    답변

    1

    AFAIK의 모양은 실제로 데이터 저장소에 표현이있다.

    안전하게 상황 별 캐시를 사용하려면 use_memcache = False, use_datastore = False, use_cache = True 플래그와 함께 일반 Model/Key get() 및 put() 연산을 사용하십시오. 클래스 정의와 같은 플래그를 모델 정의에 넣을 수도 있습니다. 모양과 엔티티 그룹의 orphanless 삭제에

    +0

    그러나 __BlobInfo__ 객체에는 조상이 없으며 저의 이해는 조상이 아닙니다. == 트랜잭션이 없습니다. 해결해야 할 주된 문제는 트랜잭션이 실패하더라도 blob을 삭제하면 blob을 삭제한다는 것입니다. – cat

    +0

    XP 트랜잭션을 사용할 수 있습니까? 그렇지 않으면, 당신은 가리고, 당신은 (아주) 작은 확률로 당신이 방울 키를 누출하게 될 것입니다. –

    +0

    불행히도 그룹당 5 개 이상의 얼룩이 있습니다 (크로스 그룹 (Xg 한도는 5)입니다.) – cat

    0

    한 가지 방법은 거래 (나무 등 작업)없이 반복 내결함성 삭제 작업을 할 수 있습니다.

  • 부모
  • 오류가 발생 언제로 잎에서 거래없이 삭제 (확인 아무도 더 이상 사용할 수 있도록하는 것이 중요합니다) 넣어, 삭제 된 엔티티/조상, 중단 마크

    1. 사용자 (삭제 된 항목을보고) 또는 시스템 (작업 대기열)을 삭제 후
    2. 이미 삭제 참조를 생략 할 수 있어야 삭제가 멱등 할
    을 다시 시도 할 수 있습니다

    누구나 그 접근법의 문제점을 볼 수 있습니까?