powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO based udp сервер - потеря данных при больших нагрузках
5 сообщений из 5, страница 1 из 1
NIO based udp сервер - потеря данных при больших нагрузках
    #38187338
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня!

Нужно было написать сервер, способный принимать до 10000 соединений в секунду. Вычитал в интернете, что вместо классического многопоточного сервака лучше написать сервак с помощью java NIO. Почитал о MINA, Netty, но это показалось мне overkill-ом, так как мой сервак ничего не пишет/не отправляет, работает только как приемник. Ну и самое главное, захотелось для опыта пощупать технологию руками. Ниже отрывки из кода, который сейчас при малых нагрузках работает. А еще ниже вопросы к этому коду, на которые хотелось бы получить ответ.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  
        // инициализация
        Selector selector = Selector.open();
        DatagramChannel serverChannel = DatagramChannel.open(); 
        serverChannel.socket().bind(new InetSocketAddress(port));
        serverChannel.setOption(StandardSocketOptions.SO_RCVBUF, 1024*1024*10); 
        serverChannel.configureBlocking(false); 
        serverChannel.register(selector, SelectionKey.OP_READ);
       
// обработка приходящих пакетов
      Set keys =  selector.selectedKeys();
             Iterator it = keys.iterator(); 
             while(it.hasNext()){
                 SelectionKey key = (SelectionKey)it.next();
                 if (key.isReadable())
                 { 
                     counter++;
                     // DatagramChannel channel = (DatagramChannel)key.channel();
                     ByteBuffer bb = ByteBuffer.allocate(2048);
                   // channel.receive(bb);
                    serverChannel.receive(bb);
                 } 
             }
       keys.clear();



1) В винде размер буфера для приема UDP пакетов по умолчанию равен всего 8 кб - увеличивал программно до 100Мб! - все равно пакеты теряются. Увеличивал так - serverChannel.setOption(StandardSocketOptions.SO_RCVBUF, 1024*1024*10); Вопрос - действительно ли буфер увеличивается и как это проверить? Может быть, как то через настройки винды можно увеличить - я не нашел. Кажется, что проблема потери пакетов именно в том, что буфер мал - когда сообщений так много, что не успеваем и обрабатывать и в буфер не помещается - сообщения теряются.

2) когда селектор отдает нам новую порцию каналов - у них у всех один DatagramChannel? Когда раньше думал, что у каждого приходящего пакета свой канал, делал так - DatagramChannel channel = (DatagramChannel)key.channel(), где key - часть новой порции - работало. Потом перестал выдергивать канал таким образом - а обращался к однаждый созданному в инициализации полю класса - serverChannel.receive(bb); Тоже работает. Но как? Неужели все пакеты с разных компов приходят по одному DatagramChannel?

3) DatagramChannel.recieve() - а чем он лучше DatagramChannel.read()? В инете пишут, что для read(), канал должен быть соединен, то есть надо сделать DatagramChannel.connect(), чтобы вызвать read(). Тогда возникает вопрос - а что, эти каналы, которые выдергивается из очередного SelectionKey, они разве не подсоединенные? Как же тогда пакет пришел? Зачем еще делать connect()?
...
Рейтинг: 0 / 0
NIO based udp сервер - потеря данных при больших нагрузках
    #38187341
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так UDP вам и не гарантирует.
...
Рейтинг: 0 / 0
NIO based udp сервер - потеря данных при больших нагрузках
    #38187345
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Connects the socket to a remote address for this socket. When a socket is connected to a remote address, packets may only be sent to or received from that address. By default a datagram socket is not connected.

connect привязывает channel к определенному адресу, если вы не вызвали коннект на serverChannel, он будет получать пакеты от всех.
...
Рейтинг: 0 / 0
NIO based udp сервер - потеря данных при больших нагрузках
    #38187381
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман, знаю, что не гарантирует, но это скорее при нестабтльном инете, у меня прикол в том, что на маленькой нагрузке 100% пакетов приходит, всегда. Увеличиваю нагрузку - теряется часть инфы. Проблема либо в буфере, либо в серваке. Суть моего вопроса - если пролема в буфере, правильно ли я его увеличиваю, потому что так как я увеличивал не помогает. А может в коде что-то не то. Может надо закрывать канал, хотя он вроде один на все соединения, поэтому нельзя. Короче, проблема не в ненадежном протоколе, а именно в моей программе.
...
Рейтинг: 0 / 0
NIO based udp сервер - потеря данных при больших нагрузках
    #38187399
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BaurzhanS,

если данных становится больше, чем FIFO в сетевой карте, они всеравно будут пропадать.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO based udp сервер - потеря данных при больших нагрузках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]