44

セットアップ:
ユーザーが投稿を送信すると、それが多数 (数百、数千、またはそれ以上) のユーザーによって読まれる「Twitter のような」サービスを想像してみてください。

私の質問は、キャッシュとデータベースを設計して、迅速なアクセスと多くの読み取りを最適化しながら、ユーザーが(必要に応じて)古い投稿を表示できるように履歴データを保持する最善の方法に関するものです。ここでの仮定は、ユーザーの 90% が新しいものだけに興味を持ち、古いものには時々アクセスするということです。ここでのもう 1 つの仮定は、90% を最適化したいということです。古い 10% の取得に少し時間がかかっても問題ありません。

これを念頭に置いて、私の調査では、キャッシュを 90% に使用し、投稿を別の長期永続システムに保存するという方向性を強く示しているようです。したがって、これまでの私の考えは、Redis をキャッシュに使用することです。利点は、Redis が非常に高速であることと、多くの人に投稿を公開するのに最適な pub/sub が組み込まれていることです。そして、MongoDB をより永続的なデータ ストアとして使用して、Redis から期限切れになったときにアクセスされる同じ投稿を保存することを検討していました。

質問:
1. このアーキテクチャは水を保持しますか? これを行うより良い方法はありますか?
2. Redis と MongoDB の両方に投稿を保存するメカニズムに関して、私はアプリに 2 つの書き込みを行わせることを考えていました。2 つ目 - Redis への保存に成功したら、すぐに MongoDB に書き込みます。これが最善の方法ですか?代わりに、Redis に期限切れの投稿を MongoDB 自体にプッシュさせる必要がありますか? と思ったのですが、Redisから直接MongoDBにpushするという情報はあまり見つけられませんでした。

4

1 に答える 1

38

実際、Redis と MongoDB を関連付けるのは賢明です。これらは優れたチーム プレーヤーです。詳細については、次を参照してください。

redis を使用した MongoDB

重要なポイントの 1 つは、必要な回復力のレベルです。Redis と MongoDB はどちらも、許容レベルの回復力を達成するように構成できます。これらの考慮事項については、設計時に検討する必要があります。また、デプロイ オプションに制約が生じる場合があります。Redis と MongoDB の両方にマスター/スレーブ レプリケーションが必要な場合は、少なくとも 4 つのボックスが必要です (Redis と MongoDB を同じマシンにデプロイしないでください)。

ここで、キューイング、pub/sub などのために Redis を保持し、ユーザー データを MongoDB のみに保存する方が少し簡単かもしれません。理論的根拠は、異なるパラダイムを特徴とする 2 つのストアに対して同様のデータ アクセス パス (この仕事の難しい部分) を設計する必要がないことです。また、MongoDB には水平方向のスケーラビリティ (レプリカ セット、自動シャーディングなど) が組み込まれていますが、Redis には自分でできるスケーラビリティしかありません。

2 番目の質問については、両方のストアに書き込むのが最も簡単な方法です。Redis アクティビティを MongoDB にレプリケートする組み込み機能はありません。ただし、Redis キュー (アクティビティがポストされる場所) をリッスンするデーモンを設計し、MongoDB に書き込むことはそれほど難しくありません。

于 2012-06-27T10:02:19.120 に答える