Важное примечание:
Я уже задавал этот вопрос по ServerFault: https://serverfault.com/questions/349065/clustering-tcp-servers-so-can-send-data-to-all-clients,, но я бы также хотел, чтобы программистов посмотрели на проблему.
Я разрабатываю мобильное приложение в реальном времени, установив TCP-соединение между приложением и серверной частью. Каждый пользователь может отправлять сообщения всем другим пользователям.
(я создаю TCP-сервер на Python с Twisted , создаю свой собственный «протокол» для связи между приложением / бэкендом и размещаю его на Amazon Web Services . )
В настоящее время я пытаюсь сделать бэкэнд масштабируемым (и надежным). Насколько я могу судить, система может справиться с большим количеством пользователей, перейдя на более крупный сервер (что может стать довольно ограниченным) или добавив новые серверы в конфигурации кластера - то есть, если несколько серверов находятся за балансировщиком нагрузки, возможно, с 1 база данных, к которой они все имеют доступ.
Я набросал грубую архитектуру этого:
Однако что, если пользователь Red отправит сообщение всем другим подключенным пользователям? Сервер Red имеет TCP-соединение с Red, но не с Green.
Я могу придумать один способ решения этой проблемы:
- Каждый сервер может иметь открытое TCP (или SSL) соединение друг с другом. Когда один сервер хочет отправить сообщение всем пользователям, он просто передает это по своему соединению с другими серверами. В базе данных может храниться запись о том, какие серверы подключены к сети (и их IP-адреса), и один из серверов может быть boss - то есть он решает, работают ли другие, если нет, он может удалить их из базы данных (если сервер был подключен и потерял соединение с boss , он может проверить базу данных и посмотреть, была ли она удалена, и перезапустить, если она есть - иначе он может принять босс был убит.)
Очевидно, что это требует уточнения, но показывает общий принцип.
В качестве альтернативы, я не уверен, возможно ли это (- с моей стороны это определенно выглядит как желаемое за действительное):
- Возможно, пользователи могли бы просто подключиться к устройству или маршрутизатору, и все серверы могли бы отправлять сообщения всем пользователям через него?
Если вы знаете, как эффективно кластеризовать TCP-серверы, или шаблон проектирования, который предоставляет решение, или у вас есть какие-либо комментарии, то я был бы очень признателен. Спасибо: -)