Я разрабатываю мобильное приложение в реальном времени, устанавливая TCP-соединение между приложением и серверной частью. Каждый пользователь может отправлять сообщения всем другим пользователям.
(Я делаю TCP-сервер на Python с Скрученный, я создаю свой собственный «протокол» для связи между приложением / серверной частью и размещаю его на Веб-сервисы Amazon.)
В настоящее время я пытаюсь сделать бэкэнд масштабируемым (и надежным). Насколько я могу судить, система могла бы справиться с большим количеством пользователей, обновившись до более крупного сервера (что может стать довольно ограничивающим) или добавив новые серверы в конфигурацию кластера, то есть имея несколько серверов, находящихся за балансировщиком нагрузки, возможно, с 1 база данных, к которой они все имеют доступ.
Я набросал грубую архитектуру этого:
Однако что, если красный пользователь отправит сообщение всем другим подключенным пользователям? Сервер Red имеет TCP-соединение с Red, но не с Green.
Я могу придумать один способ справиться с этой проблемой:
Ясно, что это требует уточнения, но показывает общий принцип.
В качестве альтернативы я не уверен, возможно ли это (- определенно похоже на принятие желаемого за действительное с моей стороны):
Если вы знаете, как эффективно кластеризовать TCP-серверы, или знаете шаблон проектирования, обеспечивающий решение, или вообще имеете какие-либо комментарии, то я был бы очень благодарен. Спасибо :-)
Есть разные способы сделать это в зависимости от того, сколько серверов вы в конечном итоге ожидаете. Примерно до 50 серверов, вы можете выбрать два или три сервера, которые будут выступать в качестве «концентраторов», каждый концентратор подключается к любому другому концентратору. Каждый не-концентратор подключается к двум концентраторам.
Отправьте сообщение всем подключениям, кроме того, по которому вы его получили. Если вы получили повторяющееся сообщение, не обращайте на него внимания. Вам нужно будет отслеживать недавно полученные сообщения, чтобы обнаружить дубликаты.
Вы можете отслеживать рабочие серверы в базе данных.
В качестве альтернативы можно использовать серверную архитектуру, которая уже делает это. Например, вы можете использовать IRC-серверы в качестве широковещательного уровня.
Я работаю над новым проектом, который должен сделать TCP-серверы распределенными. Реализуем сервер на Java. И в моем решении используется Hazelcast (также реализованный на Java) для распространения карты, содержащей всех пользователей и очередь для хранения событий кластера.
С помощью карты я могу легко определить, на каком узле находится пользователь, поэтому, если serverA получил сообщение от пользователя user1 к user2, serverA может найти карту и окажется, что user2 находится в ServerB, поэтому serverA заключит сообщение в событие кластера. с целевым сервером как ServerB и поместите его в очередь. Затем ServerB обработает событие и отправит сообщение пользователю user2.
Это может повлиять на пропускную способность и задержку для всего кластера, но, насколько известно, это терпимо.