1

Google App Engine で Twitter アプリを作成しています。コマンドをダイレクト メッセージとして受け入れるので、定期的に DM を処理するハンドラーを呼び出すサード パーティの cronjob サービスをセットアップしました。エントリが 1 つだけのモデル 'Info' があります。このモデルには、アプリの多くの場所で使用されるいくつかの共通データが格納されています (この場合、メッセージが最近処理された時間)。私のハンドラーの一般的なパターンは次のとおりです。

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 回以上処理されます。しかし、データストアの例外は発生していません。これは、たまにしか発生しません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

Google AppEngine データストアは、分散データベース システムである BigTable を内部で使用しています。このため、新しいデータがまだすべての分散テーブルに到達していないため、更新がすぐに表示されない場合があります (Amazon は、SimpleDB でこれを「結果整合性」と呼んでいます)。数分後には元気になるはずです。

于 2009-04-01T13:50:10.697 に答える
0

GAE データストアの一貫性に関する適切なドキュメントを次に示します。

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

結論:

結果整合性は、開発者がスケーラビリティ、パフォーマンス、一貫性の最適なバランスを見つけることを可能にする非リレーショナル データベースの重要な要素です。アプリケーションに最適なデータ モデルを設計するには、結果整合性と強力な整合性のバランスを取る方法を理解することが重要です。Google Cloud Datastore では、エンティティ グループと祖先クエリを使用することが、エンティティのスコープ全体で強整合性を保証する最善の方法です。前述の制限のためにアプリケーションにエンティティ グループを組み込むことができない場合は、キーのみのクエリや Memcache の使用など、他のオプションを検討できます。大規模なアプリケーションの場合は、分散 ID の使用やインデックス作成の削減などのベスト プラクティスを適用して、一貫性に必要な時間を短縮します。

于 2014-08-30T13:56:42.263 に答える