0

Polymer をフロントエンドとして使用するノード アプリケーションがあります。アプリは、HTTP2 を使用して HTTP などを処理する nginx リバース プロキシの背後で実行されます。署名付き Cookie で Cookie セッションを使用しています。

ここで、アプリに「リアルタイム チャット」を追加する必要があります。2016年は簡単だと思っていたのですが… 間違っていました。

私の最初の寄港地はプリムスでした。しかし、私にはよくわからないことがあります:

  • ノードサーバーを再起動するとどうなりますか? すべてのクライアントを再接続する必要がありますか?
  • クライアントは特定のイベント タイプに「登録」できます (Primus/Websockets などを介して受信することになっています)。そのため、開かれた各「タブ」には独自の ID が必要です。サーバーが再起動され、クライアントが再接続された場合、サーバーは「サブスクリプション」のリストを再利用できますか? (これには、クライアントが同じ「ID」を持っている必要があります)

私が気付いていない、これらすべてに対する標準的な解決策はありますか?

4

1 に答える 1

0

私は最近、チャット プロジェクトに取り組み、クライアント側でも Polymer を使用しました。

サーバー側では、私のようにFeathersを使用できます。基本的に、Feathers はExpressの最小限のラッパーであり、リアルタイム通信のために内部でWebsockets とSocket.IOを使用します。これは非常にうまく機能します。接続の作成などについて心配する必要はありません。また、Polymer コンポーネントに簡単にラップできるクライアント側の JS ライブラリもあります。

ノードサーバーを再起動するとどうなりますか? すべてのクライアントを再接続する必要がありますか?

答えはイエスです。自動的に再接続されます。

クライアントは特定のイベント タイプに「登録」できます (Primus/Websockets などを介して受信することになっています)。そのため、開かれた各「タブ」には独自の ID が必要です ...

Feathers アプリをどのように設計するかは、あなた次第です。私が理解しているように、あなたはFacebookのようなものを望んでいます。そこでは、これらのタブにさまざまな人または複数の人がいます。

このために、マスター/ディテール データ構造を使用しました。

会話 (1) --- (n) メッセージ

例:

会話

{
  "doc_created_at": "2016-09-21T07:30:02.289Z",
  "doc_created_by": "299009a4-5423-4cdd-9e1a-59fca59404ae",
  "doc_id": "00f61c96-4bc6-4c46-a22d-de246314695c",
  "doc_patched_at": "2016-10-27T11:35:53.599Z",
  "doc_type": "conversation",
  "participants": [
    {
      "id": "635b05bc-ae23-4c5d-9ee5-87e7da2cac15",
      "name": "User 1"
    },
    {
      "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
      "name": "User 2"
    }
  ],
  "sender": {
    "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
    "name": "User 2"
  },
  "last_message": "How are you?"
}

メッセージ #1

{
  "conversation_id": "00f61c96-4bc6-4c46-a22d-de246314695c",
  "doc_created_at": "2016-09-23T06:10:28.727Z",
  "doc_created_by": "299009a4-5423-4cdd-9e1a-59fca59404ae",
  "doc_id": "00e5b904-c9fa-46f1-b108-9fc9a15d11fc",
  "doc_type": "message",
  "participants": [
    {
      "id": "635b05bc-ae23-4c5d-9ee5-87e7da2cac15",
      "name": "User 1"
    },
    {
      "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
      "name": "User 2"
    }
  ],
  "sender": {
    "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
    "name": "User 2"
  },
  "message": "Hi"
}

メッセージ #2

{
  "conversation_id": "00f61c96-4bc6-4c46-a22d-de246314695c",
  "doc_created_at": "2016-09-21T07:32:08.312Z",
  "doc_created_by": "299009a4-5423-4cdd-9e1a-59fca59404ae",
  "doc_id": "2a6c2f91-04a8-4447-a0a6-4b229d523afc",
  "doc_type": "message",
  "participants": [
    {
      "id": "635b05bc-ae23-4c5d-9ee5-87e7da2cac15",
      "name": "User 1"
    },
    {
      "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
      "name": "User 2"
    }
  ],
  "sender": {
    "id": "299009a4-5423-4cdd-9e1a-59fca59404ae",
    "name": "User 2"
  },
  "message": "How are you?"
}

これらの情報をデータベース ( Couchbase ) に保存しました。

于 2016-12-09T10:07:50.800 に答える