SocketChannel: один или несколько, что лучше? - PullRequest
2 голосов
/ 11 июля 2011

SocketChannel является поточно-ориентированным, поэтому для связи между клиентом и сервером необходим только один канал. канал обслуживал операции чтения / записи одновременно

Но если мы используем несколько каналов ( более одного соединения между одним и тем же клиентом и сервером ), будет ли улучшена производительность ввода-вывода ???

Если можете, то почему ??????

Любой ответ приветствуется.

Предположим, клиент кеша опрашивает данные с удаленного сервера.

public class Client(){
    public Object getThroungOneChannel(Object key){
       getTheUniqueChannel().write(request);
       waitForResponse();
    }

    public Object getWithMultiChannel(Object key){
       getChannelFromAPool().write(request)
       waitForResponse();
    }
}

Какой путь будет иметь лучшую производительность.

Ответы [ 4 ]

1 голос
/ 11 июля 2011

Обычно использование нескольких TCP-соединений не увеличивает производительность.

В случае «сети с длинным толстым каналом» одно TCP-соединение не может использовать всю доступную полосу пропускания. В этом случае несколько соединений TCP могут увеличить производительность.

Google "длинная толстая труба" для получения дополнительной информации.

1 голос
/ 11 июля 2011

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

И для вашего приведенного примера, я считаю, в тривиальных случаях getThroungOneChannel() будет превосходить getWithMultiChannel()

0 голосов
/ 11 июля 2011

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

0 голосов
/ 11 июля 2011

Из javadocs класса SocketChannel

"Каналы сокетов безопасны для использования несколькими параллельными потоками. Они поддерживают одновременное чтение и запись, хотя чтение может выполняться не одним потоком, а максимум одним потоком.запись в любой момент. Методы connect и finishConnect синхронизируются друг с другом, и попытка инициировать операцию чтения или записи во время вызова одного из этих методов будет блокироваться до тех пор, пока этот вызов не будет завершен. "

Похоже, что чтение / запись через несколько потоков сериализуются.Таким образом, один канал имеет ограниченную пропускную способность.Но если вы говорите о наличии нескольких каналов - при условии, что все они подключены к разным сокетам (портам) на клиенте / сервере, он должен иметь более высокую производительность ввода-вывода.Тест сможет доказать это, и вот несколько примеров того, как использовать классы Socket и SocketChannel для этого теста.http://www.exampledepot.com/taxonomy/term/196

HTH, K

...