Пишу серверное приложение. Но могу уточнить, клиентское серверное приложение) Тоесть сервер будет запущен на обычных десктопах, к нему не будет обычно более 50 подключений.
Хорошая ли идея использовать следующее решение. На каждое соединение 3 потока и 2 блокирующие очереди. Приходят сообщения, их надо обработать и ответить. Каждое сообщение проходит приблизительно так.
сеть -> MessageReceiverThread -> MessagesQueue -> MessageHandlerThread -> MessageResponsesQueue -> MessageSenderThread -> сеть
Каждый тред ждет на блокирующей очереди или сети, потом парсит/сереализирует/обрабатывает и передает дальше
У этой схемы есть плюс - хороший контроль над перегрузками в любой точке обработки сообщения. При перегрузке на любом этапе сообщение можно выбросить. Система такая что это не страшно, и поддерживается алгоритмом, который это сообщение отправлял.
Смущает банально количество тредов. Пока система не подводила, но и нагрузок особых не было. С другой стороны два из них просто занимаются IO.
Похожий проект был на .NET на Asynchronous IO. Все бы хорошо, только Thread Pool там был прибитый гвоздями внутри .NET и контроля за ним особо не было. И когда много обработчиков какого-то типа чего-то ждали, то не хватало места под, например, отправку сообщений. И, опа, новые треды тред пул не давал. Сейчас разбираюсь как это в Java. Надеюсь есть смысл.
Сколько тредов - много?