2017-08-21 8 views
1

私はNode.JSのSocket.IOを使ってチャットアプリケーションを作成しています。Google App EngineとSocket.IOのモバイルチャットアプリケーション

私は自分のアプリでオフラインメッセージングを実装しています。つまり、ユーザーがアプリを開いたときに、彼はオンライン時に見逃したすべてのメッセージを受け取ります。

これは私のアプローチです:

1)クライアントは、アプリを開いて、購読している/部屋 2に参加する)クライアントはSocket.IO 3にメッセージを送信します)Socket.IOはいくつかの種類にメッセージを挿入データベース/データストア 4)クライアントがメッセージを取得しようとすると、データベース/データストアからプルされ、ユーザの電話に保存されます。メッセージはデータベースから削除されます。

これは正しい方法ですか?

私はオンラインで探していましたが、Google App Engine Task Queueのようなタスク/メッセージキューを使用するように提案された人もいましたが、これはどういう仕組みか分かりません。

答えて

1

あなたのアプローチはOKですが、クライアントから受信した直後ではなく、DBからメッセージを削除しません。

質問から、あなたは現在、メッセージをデータベースに保存していないようです。 このアプローチにはいくつかの欠点があります。たとえば、ユーザーは、メッセージの一部が送信されたときに接続されていないデバイスでチャット履歴を表示できません。 DBへ

  1. 保存するすべてのメッセージ:

    は、よりエレガントな方法でそれを行うには、私が考えることができる2つの方法があります。最新のメッセージより新しいメッセージをすべて取得します(この方法では、チャットに編集機能がないと想定しています。編集はこのようにフェッチされないため)。後者は、HTTPまたはWebSocketsのいずれかを使用して実装できます。

  2. サーバーにメッセージを格納したくない場合は、メッセージの送信に使用するデバイスにある種の永続キャッシュを実装する必要があります。これはオリジナルのソリューションと非常に似ていますが、メッセージをデータベースに格納するのではなく、ユーザーのデバイスに格納しています。これは、メッセージが受信されたときを検出し、受信者が再接続したときに、欠落したメッセージの送信をトリガするために何らかのロジックを必要とする。

私の意見では、最初のアプローチは一般的な使用例のほうがはるかに優れていますが、ユースケースによって異なります。

+0

なぜ私のデータベースからメッセージを削除できないのですか? @nadavvadan –

+0

これで、ユーザーのチャット履歴は保存されないためです。これはあなたのユースケースによりますが、チャットの履歴をDBに保存して、ユーザーがデータを削除した後に同じデバイスから他のデバイスにアクセスできるようにすると思います。繰り返しますが、すべてのアプリケーションに適していないため、私は最も一般的な使用事例として私に打撃を与えています。 – nadavvadan

+0

このコンテキストでは、メッセージキューがデータベースを置き換えることができます。たとえば、データベースにメッセージを格納する代わりにRabbitMQを使用できますか? –