2016-09-24 3 views
-1

これは長年の読書の後、私の最初の投稿です。私は最近、MEANスタックを使ってメッセンジャーアプリを作った。これは一般的なsocket.ioチュートリアルやネット上の例よりも洗練されたメッセンジャーです。NodeJSメッセンジャーアプリHTTPとSocket.io - いつどこで?

のMongoDB: デシベル:メッセンジャー

コレクション: ユーザー 会話 メッセージ

それの基本的な考え方: ユーザー登録(MongoDBの中に資格情報を格納)(パスポート+ JSONウェブトークンで ログ) とチャットする登録ユーザの1人を選択します。ユーザはメッセージを送受信できます。

私のアプリは動作しますが、昨日簡単に専門家に話した後、彼はNodeJSコードに関するいくつかの大きな穴を選びました。たとえば、HTTP reqがNodeに送られたとき、req自体の中で私はさまざまなループとクエリを実行していました。要するに、私はExpressルータでdbクエリを処理すべきではないと私に言った。彼の例は、多くの会話のための大きなメッセージリストを照会すると、HTTP reqを非常に長く開いたままにしてしまうというものでした。

彼のアイデアは、Expressが要求を受け取ったとき、クライアントはすぐに応答を取得し、イベントスタックにdb要求を送信し、Nodeは完了時にsocket.ioを介して応答します。これはサーバの負荷を軽減し、最適化しますか?

私の質問は、考えられたアイデアを持つメッセンジャーアプリのために、おそらく「最適化された」ロジックですか? (登録ユーザーログインで別のユーザーが選択され、メッセージングウィンドウが開きます)? Iすでにリアルタイムでオンラインのユーザーへのメッセージのためsocket.ioを使用して(とMongoDBのにメッセージを書くことが非同期である)い

アプリのデモ:https://abrmahmessenger.herokuapp.com/

のGithub:https://github.com/abrmah/messenger

私は今までになります助けに感謝します。ありがとうございました。

答えて

0

あなたができることはすぐに約束を返してから何らかの処理を行い、その後に.thenをスローし、そのコードブロックにソケットを介してメッセージを渡すことです。これが彼の意図したものなのかどうかはわかりませんが、実際にリクエストを開いたままにしていないのではないでしょうか。結局のところ、サーバーはdbクエリを実行する必要があります。彼はreqを開いたままにしないことが正しいのですが。

+0

ご回答いただきありがとうございます。私は昨日から既にこれを実装していますし、うまくいくようです。私はサーバーの全体的な負荷が軽減されていないことを理解していますが、それはその背後にあるロジックともっと関係していると思います。私は、HTTPリクエストの代わりにソケットをいつ使用するのかを理解したい。ソケットを使用してサーバにデータをプッシュするよう指示することはできませんか?なぜソケットioを使用できるのですか?あなたが基本的な認証されたメッセンジャーシステムのための簡単な方法論を与えることができれば、それは非常に役に立つでしょう。ありがとう –

+0

彼らは両方とも自分の方法で便利です。たとえば、初期のデータセットを取得し、構造化された方法で質問/更新を行うことはAPIが優れています。ソケットは、アドホックやサーバー主導のアップデートにとって素晴らしいですが。バックエンドへのクライアント主導の時折の呼び出しを行うだけであれば、ソケットは多くのオーバーヘッドを必要とするかもしれません。リアルタイムのメッセンジャーアプリのようなものでは、ソケットが必要です。さもなければ、クライアントは新しいメッセージを継続的にポーリングする必要があります。ここで素早く読むことができます:https://www.pubnub.com/blog/2015-01-05-websockets-vs-rest-api-understanding-the-difference/amp/ – JustADude

関連する問題