sql >> データベース >  >> NoSQL >> MongoDB

MongoDBスキーマ設計-リアルタイムチャット

    Redis を使用しました 、NGINX&PHP-私のチャットプロジェクトのFPM。あまりエレガントではありませんが、それでうまくいきます。パズルにはいくつかのピースがあります。

    1. クライアントコマンドを受け取り、それらを1つの大きなリストに入れる非常に単純なPHPスクリプトがあります。また、すべてのルームリストとユーザーのプライベートリストをチェックして、配信する必要のあるメッセージがあるかどうかを確認します。これはjQueryで記述されたクライアントによってポーリングされ、数秒ごとに実行されます。

    2. サーバー側を1秒間に20回、無限ループで操作するコマンドラインPHPスクリプトがあります。このスクリプトは、このリストをチェックしてから、これらのコマンドを処理します。スクリプトは、誰がどの部屋にいて、スクリプトメモリの権限を処理します。この情報はRedisに保存されません。

    3. Redisには、各部屋のリストと、プライベートキューとして動作する各ユーザーのリストがあります。また、ユーザーがいる部屋ごとに複数のカウンターがあります。ユーザーカウンターが部屋のメッセージの総数より少ない場合は、差を取得してユーザーに送信します。

    私はこのソリューションのストレステストを行うことができませんでしたが、少なくとも私の基本的なベンチマークからは、おそらく1秒あたり数千のメッセージを処理できるでしょう。これをNode.jsのようなものに移植して、パフォーマンスを向上させる機会もあります。 Redisも成熟しており、Pub / Subscribeコマンドなどの興味深い機能がいくつかあります。これらの機能は、サーバー側のポーリングを削除する可能性があります。

    私はCometベースのソリューションを調べましたが、それらの多くは複雑で、文書化が不十分であるか、まったく新しい言語(Jetty-> Java、APE-> Cなど)を学ぶ必要があります...コメットの問題になります。だから私は投票にこだわっています。

    MongoDBでも同様のことができると思います。部屋ごとのコレクション、ユーザーごとのコレクション、そしてカウンターを維持するコレクション。これらのメッセージの送信先の管理を処理するには、バックエンドデーモンまたはスクリプトを作成する必要があります。 MongoDBの「限定コレクション」を使用することもできます。これにより、ドキュメントが並べ替えられ、古いメッセージが自動的に消去されますが、適切なカウンターを維持するには複雑になる可能性があります。



    1. pymongoを使用してJSONをmongoDBにインポートする

    2. モノラルでc#ドライバーを使用してmongoコレクションの2つのフィールドを比較する

    3. 127.0.0.1:6379でRedisに接続できませんでした:接続が自作で拒否されました

    4. Laravel Homestead Mongoのインストールにより、PHPエラーが未定義のシンボルになります:php_json_serializable_ce in Unknown on line 0