Можно ли мультиплексировать сокетные соединения? - PullRequest
4 голосов
/ 20 марта 2009

Возможно ли мультиплексирование сокетного соединения?

Мне нужно установить несколько соединений с Yahoo Messenger, и я ищу способ сделать это эффективно без необходимости держать сокет открытым для каждого клиентского соединения.

До сих пор мне приходилось использовать один сокет для каждого клиента, и это не масштабируется выше 50 000 соединений.

о, мое решение для TELCO, поэтому мне нужно, по крайней мере, набрать от 250 000 до 500 000 соединений

Я планирую привязать несколько IP-адресов к одному сетевому адаптеру, чтобы преодолеть ограничение в 65 тыс. Портов на IP-адрес.

Пожалуйста, я хотел бы помочь, понимание, которое я могу получить.

** большинство других моих вопросов на этом сайте остались без ответа :) **

Спасибо

Ответы [ 5 ]

2 голосов
/ 20 марта 2009

Это интересный вопрос о масштабировании в серьезной ситуации.

По сути, вы спрашиваете: «Как мне установить N подключений к интернет-сервису, где N>> 250 000».

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

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

Вам понадобятся серверы и сетевая инфраструктура, которые могут справиться с этим. Вам понадобится подсеть IP-адресов, каждый сервер должен иметь связь без подключения к Интернету (т. Е. Ваш маршрутизатор не будет выполнять NAT, чтобы не отслеживать более 250 000 подключений).

Вам придется поговорить с AOL. AOL не сможет справиться с этим уровнем подключения, не подумав об отключении соединения. Любая услуга такого масштаба должна быть согласована с AOL, чтобы и вы, и они могли справиться с подключением.

Существуют технологии ввода / вывода, которые вам следует изучить. Kqueue и epoll приходят на ум.

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

1 голос
/ 21 марта 2009

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

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

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

Конечно, работа с TCP / IP сама по себе довольно трудна, но на самом деле это зависит от того, насколько вы отчаянны - то есть, сколько оборудования вы можете позволить себе решить.

1 голос
/ 20 марта 2009

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

1 голос
/ 20 марта 2009

Вы можете мультиплексировать несколько соединений через один сокет, если другой конец поддерживает такую ​​операцию. Другими словами, это протокол функции - сокеты не имеют никакой собственной поддержки.

Я сомневаюсь, что у протокола Yahoo Messenger есть какая-либо поддержка.

Альтернативой (нескольким IP-адресам на одной сетевой плате) является разработка собственного протокола мультиплексирования и наличие спутниковых серверов, которые преобразуют протокол мультиплексирования в протокол Yahoo.

0 голосов
/ 21 марта 2009

500 000 произвольных соединений с Yahoo Messenger - ваша компания делает это от имени Yahoo? Кажется, что любое решение, которое существовало в течение многих лет, должно быть масштабируемым с помощью закона Мура - и, насколько я знаю, все IM-клиенты были довольно эффективными в течение долгого времени, и нет существенного увеличения спроса Я могу думать о.

Почему это не разумная проблема для решения с аппаратными средствами плюс традиционными решениями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...