3

Webサービスがあると想像してください。

  • サーバーのクラスター(nginx / node.js)で実行されます
  • すべてのデータはリモートに保存されます
  • 20ミリ秒以内に応答する必要があります

応答のために読み取る必要のあるデータは、このように分割されます。

BatchA

  • AWSDynamoDBに保存されている何百万もの小さなオブジェクト
  • ランダムにランダムに更新
  • 一貫性のある読み取りのみ、キャッチできません

BatchB

  • SQLで最大2,000レコード
  • まれに更新され、最大1KBのレコード
  • 60〜90年代まで捕まえることができます

BatchAから読み取るまで、BatchBからフェッチするレコードがわからないため、一度にすべてを読み取ることはできません。

DynamoDBからの読み取りには最大10ミリ秒かかります。離れた場所からBatchBを読み取ると、計算する時間がなくなるか、すでにタイムアウトになっている可能性があります。

私の現在の考えは、すべてのBatchBレコードを各ノードのメモリにロードすることです(これはわずか2MBです)。起動時に、システムはSQLサーバーに接続してすべてのレコードをフェッチし、60秒または90秒ごとに更新します。問題は、これを行うための最良の方法は何ですか?

それらをすべてnode.jsの変数(配列)に読み込んでから、SetTimeoutを使用して60〜90秒後に配列を更新するだけです。しかし、最善の解決策はありますか?

4

1 に答える 1

0

あなたの解決策は悪くないように聞こえます。それはあなたのニーズに合います。頑張れ。

リモートロケーションからキャッシュを更新する過程で、キャッシュのコピーを2つ保持することをお勧めします。2MBを受信して​​いる間、データの部分的なコピーを取得します。新しいデータが完全に受信されるまで、古いキャッシュを保持します。

別のアプローチは、1つのキャッシュセットのみを維持し、各レコードが到着するたびにそれを更新することです。ただし、これは実装がより難しく、エラーが発生しやすくなります。(たとえば、リモートの場所でレコードが見つからなくなった場合は、キャッシュからレコードを削除することを忘れないでください。)このアプローチはメモリを節約しますが、2MBが大したことではないと思います。

于 2012-11-05T20:32:22.497 に答える