Внутренняя архитектура приложения чата? - PullRequest
0 голосов
/ 09 июня 2018

Я рассматриваю две альтернативы для серверной архитектуры приложения чата:

  • Сервер на комнату: где пользователи подключаются к одному и тому же серверу, который перенаправляет сообщения и другие события напрямую.База данных используется для постоянства.
    • Плюсы: сообщения доставляются быстрее, эффективнее, меньше задействовано серверов
  • Сервер на пользователя: где каждый пользователь подключается к серверу, который пересылает сообщения и другие события черезброкер сообщений (т.е. Redis) на другие серверы, которые пересылают эти события пользователям.Опять же, база данных используется для постоянства.
    • Плюсы: простая архитектура, пользователи подключаются к одному серверу, более надежный

Примечание: термин «сервер» относится не к физической машине, а кконкретный адрес / порт.

Какие еще плюсы и минусы существуют для каждой модели?Какую модель я бы использовал в каких ситуациях?Существуют ли другие возможные серверные архитектуры?

В случае, если это актуально: приложение фокусируется на двухпользовательских комнатах (т. Е. Прямой обмен сообщениями) с меньшим акцентом на группы или очень большие комнаты.

Если это не та сеть Stack Exchange, о которой следует спрашивать, пожалуйста, дайте мне знать, и я могу перенести вопрос.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Мне не хватает смысла, почему вы пытаетесь создать разные адреса и порты для каждой комнаты (или того, что вы называете сервером)

Это может работать, например, как шаблон издатель / подписчик.На одном сервере и на одном адресе создайте канал, который пользователи (в одиночном или групповом разговоре) смогут прослушивать.Затем, если пользователь публикует сообщение на этом канале, вы можете отправить его всем подписчикам.

Также существуют различные способы обработки сообщений: например, сначала вставить их в базу данных, а затем опубликовать в каналах.Но, как указал @Khang, нужен брокер.Ваш брокер может самостоятельно обрабатывать сохранение сообщений или просто отправлять сообщения с одного сервера на другой.( Натс , например)

Другое дело, если вы хотите увеличить его, ваши сообщения должны иметь возможность проходить через вашу распределенную сеть, как в ситуациях, когда абонент канала подключен кдругой сервер;какой по-прежнему брокер, которого вы выбираете, может вам в этом помочь.

Но возвращаясь к плюсам и минусам, оба решения, о которых вы говорили, могут привести к тому, что вы откроете слишком много портов на слишком многих адресах (если я правильно понимаю)что, кажется, не в порядке, потому что вы можете исчерпать их, в то время как один порт может обрабатывать все, что вам нужноТакже в настоящее время я понятия не имею, как вы собираетесь это реализовать.И это может на самом деле не делать ничего быстрее, чем другие архитектуры.

0 голосов
/ 09 июня 2018

Вот кое-что, что я хочу отметить для вас:

  • При создании приложения для обмена сообщениями я предполагаю, что вы будете использовать Websocket для отправки и получения сообщений, что означает, что вам понадобится липкий сеанс, что также означаетпользователи могут подключаться к одному серверу каждый раз, когда они используют приложение
  • Вам определенно нужен брокер сообщений.Потому что без него было бы очень больно заставить все ваши серверы общаться друг с другом.Redis - хороший выбор, вы можете использовать его и для кэширования пользовательских сессий (быстрее, чем db), но все равно нужно сохранять его в db, хотя
  • Идея каждого пользователя / комнаты получить свой собственный "сервер" (адрес / порт) странно.Зачем тебе это нужно?С моей точки зрения, это довольно сложно.Вам необходимо: направить пользователей / комнаты на их выделенный порт, как узнать их выделенный порт, как иметь несколько адресов на сервер?...
...