#java #multithreading #network-programming #multicast #igmp
#java #многопоточность #сетевое программирование #многоадресная рассылка #igmp
Вопрос:
У меня проблема, которая сводит меня с ума! Как с точки зрения дизайна, так и с технической точки зрения. Мне нужно прослушать МНОГО многоадресных адресов. Они разделены на 3 группы для каждого элемента, который я отслеживаю / собираю. Я пошел по пути, когда один процесс раскручивал 100 потоков. Каждый поток использует 2 порта и три адреса / группы. (2 группы находятся на одном порту) Я использую многоадресный канал для каждого порта и использую SELECT для мониторинга данных. (Я использовал datagram, но нашел NIO MulticastChannel намного лучше). В любом случае, я вижу проблемы, из-за которых я могу подписаться примерно на тысячу таких потоков, и данные хорошо обрабатываются. Проблема в том, что через некоторое время некоторые из них перестанут получать данные. Я подтвердил в системе (CentOS), что я все еще подписан на эти адреса, но данные просто прекращаются. В моих потоках есть мониторы, которые отслеживают выпадение и нарушение порядка данных через заголовки RTP. Когда я обнаруживаю, что поток перестал получать данные, я выполняю УДАЛЕНИЕ / ОБЪЕДИНЕНИЕ, и затем данные возобновляются.
Я думаю, что маршрутизатор на моем пути удаляет мою подписку. Я нахожусь на грани написания кода для стабилизации этого процесса.
Кто-нибудь когда-либо отправлял IGMP-соединения в сеть, чтобы поддерживать поток данных? Возможно ли это или даже разумно.
Кстати: компьютер представляет собой HP DL380 Gen-9 с оптоволоконным подключением 10G к коммутатору 6509.
Любые указания на то, где искать, действительно помогли бы.
Пожалуйста, не запрашивайте никаких примеров кода.
Ответ №1:
joinGroup()
Операция уже отправляет запросы IGMP по сети. Не должно быть необходимости отправлять их самостоятельно, и в любом случае это невозможно в чистой Java.
Вы могли бы сэкономить на сокетах и потоках. Сокет может объединять до 20 групп в большинстве операционных систем, и если вы используете NIO и селекторы, в любом случае нет необходимости в более чем одном потоке.
Я использовал datagram, но нашел NIO MulticastChannel намного лучше).
Я не знаю, что это значит. Если вы имеете в DatagramSocket
виду, вы не можете использовать его для приема многоадресных рассылок, поэтому предложение бессмысленно. Если это не так, предложение не имеет смысла.