2

私はデータストアのエンティティとして、いくつかのアプリケーション設定エントリを保持したいと考えています。現在、データストアビューア(開発環境)またはGoogle Cloud Platform Datastoreユーザインタフェース(運用環境)からこれらのエントリを更新すると、新しい値はアプリケーションには表示されません。これは、ndbがエンティティをキャッシュするためです。Google App Engine Datastoreに保存されている設定エントリを更新するにはどうすればよいですか?

私の質問は、データストアに設定エントリを保存し、Googleのユーザーインターフェイスから更新したり、アプリケーションに新しい値を提供したりするための技術ですか?

Iは、以下を考えた:ndb.Model構成エントリを定義サブクラスに妥当_memcache_timeoutを設定

  1. - しかし、memcacheの使用量は(不要なデータストアが行われる読み出し)この場合の準最適です。

  2. キャッシュ設定を最大で保持しますが、アプリケーションの管理領域にflushオペレーションを実装して、エンティティを個別にフラッシュします。エンティティの実際のキャッシュキーがわからないため、これは難しいことです。しかし、通常_memcache_prefix + key.urlsafe()でなければなりません。_memcache_prefixndb.context moduleで定義されています。

  3. アプリケーションの管理領域からすべての設定エントリを更新し、Googleのデータストアユーザーインターフェイスを使用しないでください。これには余分な労力が必要です。

+1

実稼働環境と開発環境の両方のenvコンソールでは、値を更新した後にmemcacheビューアにアクセスして手動でキャッシュをフラッシュできます。あなたは、古い値は表示されなくなります。これはすべてのエントリをフラッシュしますが、影響は小さくなければなりません - あなたのアプリはmemcacheの値が消えるように準備する必要があります。 –

+1

あなたのアプリがこれらの設定をどのように使用するかに応じて、すでに実行中のアプリインスタンスも再起動する必要があります。 –

+0

@DanCornilescu私は他の目的でもキャッシュを使用します(設定エントリを格納するためだけでなく)。キャッシュ全体をフラッシュすることは、私のケースでは無視できないパフォーマンスの影響を与えます。しかし、あなたのアイデアは他のシナリオでは素晴らしいと思います。 –

答えて

2

オプション1 - ほとんどの作業

NDBクライアントライブラリを使用してApp Engineの中に独自の管理モジュールを実装します。あなた自身のアプリケーションを介してエンティティに変更を加えると、正しいMemcacheキーが自動的に書き込まれます。

オプション2 - アップデートのための取引コストは、すでに示唆したように、モデルの最大キャッシュ年齢を減らす

を遅らせます。たとえば、ほとんどの場合、変更が有効になるまでに1時間を許可するのは不合理ではありません。

オプション3 - 最小の作業が、規模

で悪い考えmemcacheのためのクラウドコンソール経由でキャッシュ全体をフラッシュします。

警告:大規模で実行すると、リクエストに膨大なスパイクが発生する可能性があるため、これは悪い考えです。たとえば、90%のキャッシュヒット率の後でデータストアに対して100万回の読み取り/秒を実行している場合、フラッシュ直後に1,000万回の読み取り/秒に急上昇する可能性があります。

+2

オプション1は複雑である必要はありません - 必要なMemcacheエントリ(たとえば "/ admin/update_config")のクリーニングをトリガーする単純な(保護された)ハンドラが必要です –

+1

@AndreiVolgin - 実際にはありませんが、まだ設定していますより多くのコード/サービスをアップ。最終的には、予定された更新、ロールバック、ロギング、変更の確認など、アプリのより機能的な管理エクスペリエンスを構築するためのジャンプポイントとして役立ちます。 –

関連する問題