Приложение для чата в реальном времени с использованием Polymer и узла

У меня есть приложение узла, использующее Polymer в качестве внешнего интерфейса. Приложение работает за обратным прокси-сервером nginx, который работает с HTTP и т. Д. С использованием HTTP2. Я использую сеансы cookie с подписанными файлами cookie.

Теперь мне нужно добавить "чат в реальном времени" в приложение; Я думал, что в 2016 году это будет легко... мальчик, я был неправ.

Моим первым портом захода был Primus. Но есть вещи, которые я не совсем понимаю:

  • Что произойдет, если сервер узла будет перезапущен? Все ли клиенту нужно будет переподключиться?
  • Клиенты могут "зарегистрироваться" для определенных типов событий (которые затем должны получать через Primus/Websockets/ и т. Д.). Таким образом, каждая открытая "вкладка" должна иметь свой собственный идентификатор; если сервер будет перезагружен, а клиент переподключится, сможет ли сервер повторно использовать список "подписок"? (для этого клиент должен иметь одинаковый идентификатор)

Есть ли стандартное решение для всего этого, о котором я не знаю?

1 ответ

Решение

Я недавно работал над проектом чата, и я также использовал Polymer на стороне клиента.

На стороне сервера вы можете использовать Перья, как я. По сути, Feathers - это минималистичная оболочка для Express, которая использует Websockets и Socket.IO под капотом для связи в реальном времени. Это работает очень хорошо, вам не нужно беспокоиться о создании связей и все такое. У них также есть библиотека JS на стороне клиента, которую вы можете легко обернуть в компонент Polymer.

Что произойдет, если сервер узла будет перезапущен? Все ли клиенту нужно будет переподключиться?

Ответ - да, они будут автоматически подключаться.

Клиенты могут "зарегистрироваться" для определенных типов событий (которые затем должны получать через Primus/Websockets/ и т. Д.). Таким образом, каждая открытая "вкладка" будет иметь свой собственный идентификатор...

Это действительно зависит от вас, как вы разрабатываете свое приложение Feathers. Как я понимаю, вы хотите что-то вроде в Facebook, где у вас есть эти вкладки с разными людьми или несколькими людьми.

Для этого я использовал структуру данных Master-detail:

Диалог (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).

Другие вопросы по тегам