Возник вопрос в процессе разработки, можно сказать идеологический.
Итак, есть физические девайсы, которые по TCP шлют данные в виде массива байт на сервер. Есть сервер, который принимает присланный массив, парсит его и сохраняет в БД.
Также у девайсов есть возможность получать извне команды, которые они обрабатывают и что-то выполняют.
Когда все это начинало программироваться, речь шла о том, чтобы посылать команду устройству вместе с ответом (на каждый коннект сервер отвечает «ОК»). То есть поймал соединение, открыл сокет, получил входящий поток, в исходящем ответил, закрыл. Соединения происходят раз в минуту, то есть устройство включится, по сути, не сразу, а по прошествии некоторого времени (меньше минуты). Это не какие-то системы быстрого реагирования, в основном при этом рядом с ними вообще никого не будет, чистая «удаленка».
Сейчас пошла речь о том, чтобы посылать команды в любой момент времени напрямую устройству. С точки зрения сети это невозможно, так как сервер в интернете, а устройсвта могут быть за натом, поключенными через мобильный инет или вообще черт знает как. То есть вариантом связи с ним может быть только установленный во время его коннекта канал.
Мне предлагают держать открытыми все соединения, которые произошли, и в случае необходимости слать туда команды.
Я же считаю, что держать открытыми пару тыщ сокетов (по треду на каждый, по идее, ведь и с той стороны данные все еще будут идти раз в минуту) - это как минимум очень накладно, а во вторых вообще полная дичь. Тем более, что для начала можно упереться в ограничение по файловым дескрипторами линукса, потом в ядро, потом…
Вопрос - может, что упускаю?