2009-04-01 16 views
1

Google App EngineでTwitterアプリを書いています。それはダイレクトメッセージとしてコマンドを受け入れるので、定期的にDMを処理するハンドラを呼び出すサードパーティのcronジョブサービスをセットアップしました。私は1つのエントリしか持たないModel 'Info'を持っており、App内の多くの場所で使用されるいくつかの一般的なデータを格納しています(この場合、メッセージが最近処理された時刻です)。Google App Engineデータベースの不一致

class Info(db.Model): 
    msg_polled = db.DateTimeProperty(auto_now_add = True) 
    .... More Properties .... 

    @classmethod 
    def get_info(cls): 
     info = cls.all().get() 
     if not info: 
      info = cls() 
      info.put() 
     return info 
--------------------------------------------------------- 
info = Info.get_info() 
msgs = api.GetDirectMessages(since = info.msg_polled) 
if not msgs: 
    return 
logging.info('Processing Messages since %s ' % str(info.msg_polled)) 
for msg in msgs: 

    ...process commands... 

    logging.info('Processed Message :- @%s : %s' % (msg.sender_screen_name, msg.text)) 

info.msg_polled = datetime.datetime.now() 
info.put() 

しかし、時には私はこのようなログを取得:私のハンドラの一般的なパターンは、このようなものです

I 03-30 07:50AM 10.973 
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:50AM 11.122 
Processed Message :- @foo : Foo_Bar 
------------------------------------------------------- 
I 03-30 07:46AM 08.014 
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:46AM 08.130 
Processed Message :- @foo : Foo_Bar 

ここでは、その情報がデータベースにコミット取得されていないようです。 msg_polled値が変更される前に、メッセージは複数回処理されます.10回以上処理されることもあります。しかし、私はDatastoreの例外を取得していません。これはしばらくの間しか起こらない。

何か助けていただければ幸いです。

+0

元の情報をどのように取得しているかは、サンプルには表示されません。あなたはそれを含めることができますか? –

+0

また、ログエントリの2番目のセットは、最初のセットの前にある - 意図的なものでしたか? –

+0

申し訳ありませんが、私も含めます。はい、ログの順序は逆順です。 – z33m

答えて

0

Google App Engineのデータストアは、配布データベースシステムであるカバーの下でBigTableを使用します。このため、新しいデータがまだすべての分散テーブルに到達していないため、更新がすぐには表示されない可能性があります(AmazonはSimpleDBのこの「最終整合性」と呼んでいます)。あなたは数分後にうまくいくはずです。ここで

+0

しかし、そのような待ち時間についての言及はありません..だから、問題を解決するcronjobの頻度を減らすでしょうか? – z33m

+0

私は自分の話をサポートするためにいくつかのリンクを探しましたが、何かを見つけることができました。私はどこかでそれを読んだと確信しています。 頻度を減らすことは、実際に役立ちます。私はあなたにそれを与え、何が起こるかを見ることをお勧めします。お知らせ下さい! – Rik

+0

cronjobは現在4分ごとに1回実行されています。ログのタイムスタンプでこれを見ることができます.4minはこの種の遅延に対しては長すぎると思うでしょうか?SimpleDBの最終的な一貫性の遅延は秒ですか? – z33m

0

は、GAEデータストアの一貫性に関する良いドキュメントです:

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

結論:

結果整合性は、開発者が最適なを見つけることができます非リレーショナルデータベースの重要な要素でありますスケーラビリティ、パフォーマンス、および一貫性のバランス。アプリケーションの最適なデータモデルを設計するためには、最終的な整合性と強力な整合性のバランスをどのように処理するかを理解することが重要です。 Google Cloud Datastoreでは、エンティティグループと祖先クエリを使用することで、エンティティの範囲にわたって強力な一貫性を保証することができます。前述の制限のためにアプリケーションでエンティティグループを組み込むことができない場合は、キーのみのクエリやMemcacheなどの他のオプションを検討することもできます。大規模なアプリケーションの場合、分散IDの使用やインデックスの縮小などのベストプラクティスを適用して、一貫性に必要な時間を短縮します。また、Google Cloud DatastoreとBigQueryを組み合わせて、複雑なクエリのビジネス要件を満たし、Google Cloud Datastoreインデックスの使用を可能な限り減らすことも重要です。