2009-10-08 1 views
1

Эй, я пишу приложение в 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 
} 

ответ

3

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

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

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

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

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

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

1

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

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

+0

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

+0

Заголовок должен быть в самом сообщении. Когда сообщение принимается с обоих концов, получатель может определить, к какому каналу относится сообщение. –