Стандартный способ использования одного порта для нескольких сокетов? - PullRequest
1 голос
/ 09 октября 2009

Эй, я пишу приложение в Twisted, и в его нынешнем виде у меня есть 4 сервера, связанных двумя разными портами, все общаются с клиентом через JSON. Есть ли какой-либо способ привязать эти 4 сервера к одному и тому же порту, и взаимодействие остается прежним?

Например, скажем, клиент подписывается на два разных канала, передаваемых через прямой сокет.

Прямо сейчас мне просто нравится

server1.read_string()
server2.read_string()

, и он будет читать правильную строку JSON из соответствующих каналов. Есть ли способ поддерживать функциональность такого типа, но связаться с моим сервером через тот же порт?

Я не хочу складывать все функциональные возможности сервера в один массивный сервер и разбивать данные по префиксам заголовков.

Я не хочу делать что-то вроде

s = server.read_string()
header = s.split(//some delimiter)[0]
if (header == "SERVER1")
{
   // Blahh
}

Ответы [ 2 ]

3 голосов
/ 19 октября 2009

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

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

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

Squid , Varnish , HAProxy - хорошие обратные прокси, и даже Apache может сделать это для вас.

Я планирую использовать HAProxy для Gridspy, мой проект , так как у меня много постоянных соединений с моими клиентами и я хочу разместить орбитальный сервер по тому же пути URL, что и мой сервер django. См. В этом руководстве для получения дополнительной информации о том, как переадресовать множество соединений через порт 80 с одного сервера на несколько. Это руководство сфокусировано на Comet, но ваша проблема еще проще.

Если вы рассматриваете текущее соединение tcp / ip из браузера обратно на свои серверы, серьезно подумайте о Orbited . Смотрите этот урок о графах через orbited и morbidQ . Orbited также будет проходить через брандмауэры и прокси лучше, чем большинство пользовательских решений, так как выглядит как обычный HTTP-трафик.

1 голос
/ 09 октября 2009

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

В противном случае лучше всего иметь один сервер, который использует заголовки для определения конкретных каналов. Почему ты не хочешь этого делать?

...