0

世界中のさまざまな都市のリアルタイムの気温データを 10 分ごとに収集するアプリがあるとします。

次の GAE データストア モデルを使用すると、

class City(db.Model):
    name = db.StringProperty()

class DailyTempData(db.Model):
    date = db.DateProperty()
    temp_readings = db.ListProperty(float, indexed=False) # appended every 10 minutes

そして cron.yaml など、

cron:
- description: read temperature
  url: /cron/read_temps
  schedule: every 10 minutes

私はすでに GAE のデータストア書き込み用の 1 日あたりの無料クォータに達しており、この問題を回避する方法を探しています。

毎日の終わりにのみ温度データを永続化することで、データストアへの書き込みを減らすことを考えています。これにより、(各都市の) 1 日あたりの書き込み量が 144 回から 1 回に効果的に減少します。

これを行う 1 つの方法は、memcache を一時的なスクラッチパッドとして使用することですが、データがランダムに削除される可能性があるため、その日のすべてのデータが失われる可能性があります。(質問はさておき: 経験上、計画外の立ち退きは実際にどのくらいの頻度で発生しますか?)

質問は次のとおりです。

  1. 説明されているように、データストアへの書き込みを減らすことができるようなメモリ/ストレージ機能 (cron ジョブ全体で永続的かつ保証されている) はありますか?
  2. そうでない場合、代替ソリューションは何ですか?

他の唯一の要件は、温度の読み取り値が (クライアント側に提供するために) いつでもアクセスできる必要があることです。

4

2 に答える 2

2

データストアで唯一保証されているストレージ。

memcache のエビクションに関しては、何が起こっているかによって異なります。アプリと google appengine ランドでは、エビクションは 1 分、2 分、または数時間後に発生する可能性があります。私の appengine インスタンスでは、通常、最も古いアイテムが約 2 時間経過しています。しかし、それはすべて依存しており、あなたはそれに頼ることはできません.

タスク キューのペイロードは約 10K です。

ブロブ (10 分間隔で測定されたすべての都市を含む) を作成し、それを再処理して選択を解除し、1 日の終わりに都市の詳細を書き出すことができます。

クライアントが温度測定値にアクセスできなければならないと言うとき、それはその日の現在の測定値だけですか、それともすべての測定値を意味しますか?

于 2013-05-08T04:32:45.570 に答える
1

モデルを変更して、実行ごとまたは cron ごとに巨大なオブジェクトを保存することもできます。各都市だけではありません。たとえば、オブジェクトの名前が Measures だとします... Measures アイテムには、対応する時間のすべての測定値のリストが含まれます。それらをインデックスなしのプロパティとして保存すれば、問題はありません...また、1日あたりわずか144回の書き込みです。

読み取り部分について... 良い使用パターンとして、memcache を使用して Measures アイテムを格納します。

于 2013-05-08T19:08:04.973 に答える