6

먼저 스택 오버플로에 대한 첫 번째 게시물이므로 새삼스런 실수를 용서하십시오. 내 질문의 틀이 어떻게 드러나는 지 명확하게 알 수 있다면 알려주십시오.GAE 데이터 저장소에서 스키마 이전

Google App Engine에서 대형 응용 프로그램을 실행 중이며 이전 데이터 클래스를 수정하고 새 클래스를 추가해야하는 새로운 기능이 추가되었습니다. 데이터베이스를 정리하고 오래된 항목을 업데이트하기 위해 클래스의 인스턴스를 반복하고 변경 한 다음 다시 저장할 수있는 스크립트를 작성하려고했습니다. 문제는 Google App Engine이 몇 초가 걸리는 서버 호출을 할 때 시간이 초과된다는 것입니다.

저는 몇 주 동안이 문제로 어려움을 겪었습니다. 내가 찾은 가장 좋은 방법은 여기에 있습니다 :

def schema_migration (self, target, batch_size=1000): 
    last_key = None 
    calls = {"Affiliate": Affiliate, "IPN": IPN, "Mail": Mail, "Payment": Payment, "Promotion": Promotion} 

    while True: 
     q = calls[target].all() 
     if last_key: 
      q.filter('__key__ >', last_key) 
     q.order('__key__') 
     this_batch_size = batch_size 

     while True: 
      try: 
       batch = q.fetch(this_batch_size) 
       break 
      except (db.Timeout, DeadlineExceededError): 
       logging.warn("Query timed out, retrying") 
       if this_batch_size == 1: 
        logging.critical("Unable to update entities, aborting") 
        return 
       this_batch_size //= 2 

     if not batch: 
      break 

     keys = None 
     while not keys: 
      try: 
       keys = db.put(batch) 
      except db.Timeout: 
       logging.warn("Put timed out, retrying") 

     last_key = keys[-1] 
     print "Updated %d records" % (len(keys),) 

이상하게 코드와 클래스를 완벽하게 작동합니다 : http://code.google.com/p/rietveld/source/browse/trunk/update_entities.py?spec=svn427&r=427

난 당신이 여기에서 볼 수있는 내 자신의 웹 사이트에 대한 해당 코드의 버전을 개발 100 - 1,000 개의 인스턴스 사이에 있으며 스크립트는 종종 10 초 정도 걸립니다. 내가 더 좋아 100K 인스턴스와 우리의 데이터베이스 클래스의 코드를 실행하려고 할 때, 스크립트는 30 초 동안 수행 한 후, 나는이 나타납니다

"오류 : 서버에 오류가 발생

서버 오류 문제가 지속되면 문제를보고하고이 오류 메시지와 그 원인을 알린 쿼리를 언급하십시오. ""

정확히 30 초 후에 GAE가 시간 초과되는 이유는 무엇입니까? 이 문제를 해결하려면

고맙습니다! 켈러

+0

정말 빨리 문의해야합니다. 여기 또는 App Engine Google 그룹 (http://groups.google.com/group/google-appengine-python).마이그레이션은 일반적인 문제이며, 사람들은 제공 할 솔루션이 많습니다. 혼자 힘겨워하지 마라. – Calvin

답변

4

두 번째 DeadlineExceededError는 소리로 치고 있습니다. AppEngine 요청은 각각 30 초 동안 만 실행될 수 있습니다. DeadLineExceedError가 발생하면 처리를 멈추고 시간이 없어지면 정리가 잘됩니다. 다음에 발생시킬 때 잡을 수 없습니다.

이동을 일괄 처리로 분할하고 작업 대기열을 사용하여 각 일괄 처리를 실행하려면 Mapper API을 사용해야합니다.

1

해결 방법의 시작은 GAE의 작업 대기열을 사용하도록 마이그레이션하는 것입니다. 이 기능을 사용하면 나중에 더 많은 작업을 대기열에 넣을 수 있습니다.

작업 대기열도 짧은 시간 제한으로 제한되므로 실제로 문제가 즉시 해결되지는 않습니다. 그러나 루프를 풀어 한 번에 데이터베이스에있는 소수의 행을 처리 할 수 ​​있습니다. 각 배치를 완료 한 후, 얼마나 오래 실행되었는지를 확인할 수 있으며, 충분히 길다면 현재 작업이 중단되는 곳에서 계속 진행하기 위해 대기열에서 새 작업을 시작할 수 있습니다.

대체 솔루션은 이 아니며 데이터를 마이그레이션하는 것입니다. 구현 논리가 각 엔티티가 마이그레이션되었는지 여부를 알 수 있도록 변경하십시오. 새로 생성 된 엔티티 또는 업데이트 된 이전 엔티티는 새 형식을 사용합니다. GAE는 엔티티가 모두 동일한 필드를 요구하지 않기 때문에 관계형 데이터베이스에서 실용적이지 않은 경우 쉽게 수행 할 수 있습니다.

+0

작업 대기열을 10 분 동안 실행할 수 있습니다. 10 초 안에 1000을 돌파 할 수 있기 때문에 10 분 이내에 전체 마이그레이션을 수행 할 수 있습니다. – Calvin

+0

오존과 MacGuy에게 감사드립니다! 저를 올바른 방향으로 안내 할 시간을 내 주셔서 감사합니다. 지금 작업 대기열 API를 통해 작업 중 ... – Keller

관련 문제