Кластеризация TCP-серверов, поэтому можно отправлять данные всем клиентам - PullRequest
2 голосов
/ 12 января 2012

Важное примечание:

Я уже задавал этот вопрос по ServerFault: https://serverfault.com/questions/349065/clustering-tcp-servers-so-can-send-data-to-all-clients,, но я бы также хотел, чтобы программистов посмотрели на проблему.


Я разрабатываю мобильное приложение в реальном времени, установив TCP-соединение между приложением и серверной частью. Каждый пользователь может отправлять сообщения всем другим пользователям.

(я создаю TCP-сервер на Python с Twisted , создаю свой собственный «протокол» для связи между приложением / бэкендом и размещаю его на Amazon Web Services . )


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

Я набросал грубую архитектуру этого: TCP server cluster problem

Однако что, если пользователь Red отправит сообщение всем другим подключенным пользователям? Сервер Red имеет TCP-соединение с Red, но не с Green.

Я могу придумать один способ решения этой проблемы:

  • Каждый сервер может иметь открытое TCP (или SSL) соединение друг с другом. Когда один сервер хочет отправить сообщение всем пользователям, он просто передает это по своему соединению с другими серверами. В базе данных может храниться запись о том, какие серверы подключены к сети (и их IP-адреса), и один из серверов может быть boss - то есть он решает, работают ли другие, если нет, он может удалить их из базы данных (если сервер был подключен и потерял соединение с boss , он может проверить базу данных и посмотреть, была ли она удалена, и перезапустить, если она есть - иначе он может принять босс был убит.)

Очевидно, что это требует уточнения, но показывает общий принцип.

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

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


Если вы знаете, как эффективно кластеризовать TCP-серверы, или шаблон проектирования, который предоставляет решение, или у вас есть какие-либо комментарии, то я был бы очень признателен. Спасибо: -)

Ответы [ 4 ]

3 голосов
/ 12 января 2012

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

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

2 голосов
/ 12 января 2012

Посмотрите, как это происходит с IRC-серверами .По сути, они уже могут это сделать.Все могут отправлять всем, на всех серверах.Или только для отдельных пользователей, а также на другом сервере.И для групп, называемых «каналами».Лучше всего он работает при маршрутизации между серверами.

Это не так сложно, если вы можете убедиться, что серверы знают друг друга и могут общаться друг с другом.

С другой стороны: на 9/ 11, самым надежным источником новостей в Интернете была сеть IRC.Все сайты www были недоступны из-за пропускной способности;им потребовались целые годы, чтобы восстановить обычную текстовую веб-страницу.В течение этого времени сети IRC могли предоставлять модерируемые новостные каналы практически в режиме реального времени по всей Атлантике.Возможно, вы больше не можете войти на сервер с другой стороны, но, по крайней мере, серверы смогли поддерживать соединение между серверами.

0 голосов
/ 22 декабря 2013

TCP-сервер не может быть кластеризован, приведенный здесь снимок - классический пример HTTP-сервера. Поскольку устройство будет отправлять TCP-соединение на сервер, скажем, через чистый сокет, сейчас будет возможность установить сервер с балансировкой нагрузки.

0 голосов
/ 12 января 2012

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

...