3

私は、単に受信メッセージを送信するよりも少し高度なメッセージング システムに取り組んでいます。これは Facebook のチャット/メッセージングのようなものです。チャットの側面だけでなく、グループ メッセージ、既読/未読メッセージなどのメッセージングの側面もあります。

redis では、単純にリストを使用して、受信したメッセージを保存します。たとえば、次のようになります。

myID = [ "amy|how are you?", "frank|long time no see!" ]
amyID = [ "john|I'm good! you?" ]

(読みやすくするために、すべてを大幅に簡略化しました。

しかし、この方法では、メッセージが受信されるとすべてが常にフラッシュされるため、単一の会話を追跡することはできません (したがって、基本的に「受信トレイ」機能はありません.

一方、mongodb を使用する場合は、次のようなものを使用できます。MongoDB を使用してプライベート メッセージング システムを追跡する方法は?

私は次の利点/欠点について考えました:

モンゴッド

利点:

  • 受信トレイ ビューを表示できます
  • 各会話の既読/未読メッセージを確認できます

短所

  • redisほど速くない
  • ストレージのサイズが大幅に増加します

REDIS

利点:

  • 新しいメッセージを拾いやすい
  • ストレージの問題はありません (メッセージはフラッシュされます)

欠点:

  • クライアントに送信されたメッセージは失われるため、既読/未読機能はありません。
  • 受信トレイなし

何か案は?

前もって感謝します。

4

3 に答える 3

6

私はRedisを使用しておらず、使用したことがないため、Redisについては答えることができません。

ただし、何らかの理由で、Facebook のような XMPP クライアントのようなものを使用していない場合: http://www.ibm.com/developerworks/xml/tutorials/x-realtimeXMPPtut/section3.html (別名 Jabber) チャットこの状況での純粋な MongoDB ソリューションについて説明します。

MongoDB は、ドキュメントとクエリをキャッシュする手段として OS の LRU を使用しますが、直接クエリ キャッシュを提供することはありませんが、賢ければ必要ありません。代わりに、すべてのクエリを RAM から直接読み取るだけです。これを念頭に置くと、Redis はコンピューターの RAM も使用するため、MongoDB は Redis と同じくらい高速になる可能性があります。

最適化されたクエリでの 2 つの間の速度は、ごくわずかだと思います。速度の真の尺度は、スキーマ、インデックス、クラスターのセットアップ、および実行するクエリによって決まります。

あなたのコメントを考慮して、ここにストレージサイズに関するメモ:

ただし、mongodb のフラッシュに関する問題は、当初よりも大きくなっています。明らかに、mongo で何かを削除すると、その参照のみが削除されるため、4 MB のドキュメントを削除しても、それほど多くのスペースは解放されません。そのメモリを実際に解放する唯一の方法は、実行中に基本的にdbをブロックするdbRepair(またはこの行の何か)を実行することです....

MongoDB がどのように機能するかについて、いくつかの誤解があるようです。

このリンクが役に立ちます: http://www.10gen.com/presentations/storage-engine-internals過剰なディスク容量が使用される理由のいくつかを説明し、あなたが持っている誤解についても説明します。コンピューターの仕組みと、MongoDB がスペースを解放して再利用する方法。

MongoDB は、レコード レベルで領域を解放しません。代わりに、その「空の」レコードを送信し (プレゼンテーションで説明するように、レコードとドキュメントは 2 つの異なるものです)、それを削除されたバケット リストに押し込み、新しいドキュメント (または移動された更新されたドキュメント) が作成されたときにそのスペースを再利用します。 )がやってきて、そのスペースに収まります。

repairDBこのレベルで MongoDB がどのように機能するかを注意深く理解していない場合、断片化後に何らかのパフォーマンスを維持するためにかなり定期的に実行する必要があることは事実です。

メモリの扱いについて。私が言ったように、OSはこれを処理します。OS がいつメモリを解放するかについての適切な説明は、ウィキペディアにあります: http://en.wikipedia.org/wiki/Paging

必要なすべてのデータを格納するのに十分な RAM がなくなるまで、空のページ フレームを取得するプロセスでは、RAM から別のページを削除する必要はありません。

そのため、OS がページの削除を処理します。その部分については気にする必要はありません。代わりに、ワーキング セットを RAM に収めることに注意する必要があります。

メッセージの保存が心配で、実際には保存したくない場合、つまりメッセージを「フラッシュ」したい場合は、MongoDB の後のインストールに付属する TTL 機能を実際に使用できます: http://docs.mongodb.org/manual /tutorial/expire-data/これにより、基本的にメッセージをコレクションから削除するタイムアウトを設定できます。

したがって、個人的には、MongoDB を適切にセットアップして Facebook のようにメッセージングとチャットを行うことができれば、もちろん、彼らは XMPP プロトコルを使用し、検索のためにメッセージを Cassandra にアーカイブしますが、彼らのようにそれを行う必要はありません。同じ目標を達成する方法。

これが理にかなっていることを願っています。私はぐるぐる回っていません。少し長い答えです。

于 2013-01-22T23:09:14.410 に答える
0

ここでの大きなポイントはストレージの問題だと思います。MongoDB を使用するには、多くのマシンまたはいくつかの会話をフラッシュする優れたシステムが必要です。一種の「受信トレイ」システムが必要ですが... redis はうまく機能するチャットシステムを助長すると思います.非常に創造的な回避策を考え出す必要があります...またはその設計目標を放棄する必要があります.

于 2013-01-22T16:18:38.100 に答える