Иногда при отправке большого объема данных через SocketChannel.write () базовый буфер TCP заполняется, и мне приходится постоянно повторять попытку write (), пока все данные не будут отправлены.
Итак, у меня может быть что-то вроде этого:
public void send(ByteBuffer bb, SocketChannel sc){
sc.write(bb);
while (bb.remaining()>0){
Thread.sleep(10);
sc.write(bb);
}
}
Проблема в том, что случайная проблема с большим ByteBuffer и переполнением основного буфера TCP означает, что этот вызов send () будет блокироваться на неожиданное количество времени. В моем проекте одновременно подключены сотни клиентов, и одна задержка, вызванная одним соединением с сокетом, может привести к обходу всей системы до тех пор, пока эта задержка с одним SocketChannel не будет решена. Когда происходит задержка, она может вызвать цепную реакцию замедления в других областях проекта, и важно иметь низкую задержку.
Мне нужно решение, которое позаботится об этой проблеме переполнения буфера TCP прозрачно и не заставляя все блокировать, когда требуются множественные вызовы SocketChannel.write (). Я подумал о том, чтобы поместить send () в отдельный класс, расширяющий Thread, чтобы он работал как собственный поток и не блокировал вызывающий код. Однако меня беспокоят дополнительные затраты, необходимые для создания потока для каждого подключения сокета, который я поддерживаю, особенно когда в 99% случаев SocketChannel.write () завершается успешно с первой попытки, то есть нет необходимости в наличии потока , (Другими словами, размещение send () в отдельном потоке действительно необходимо, только если используется цикл while () - только в тех случаях, когда существует проблема с буфером, возможно, в 1% случаев). Если есть проблема с буфером только 1% времени, мне не нужны служебные данные потока для остальных 99% вызовов send ().
Надеюсь, это имеет смысл ... Я мог бы действительно использовать некоторые предложения. Спасибо!