Количество потоков в промежуточном приложении
Я пишу сервер приложений (опять же, не связанный с вопросом, который я уже разместил здесь), и мне интересно, какие стратегии использовать при создании рабочих потоков, которые работают с базой данных. Некоторые предварительные даты: сервер получает xml и отправляет обратно xml, все запросы запрашивают базу данных - каждый запрос может занять от нескольких миллисекунд до нескольких секунд.
Скажем, например, что ваш сервер обслуживает небольшое или среднее количество клиентов, которые, в свою очередь, отправляют небольшое количество запросов на соединение. Безопасно ли иметь один рабочий поток на соединение или он должен быть на запрос? Также должен ли пул потоков использоваться для ограничения ресурсов, используемых сервером, или рабочий должен добавляться каждый раз при создании нового соединения / запроса?
Должен ли сервер ограничивать количество создаваемых потоков до верхнего предела?
Надеюсь, я не слишком смутен... Я с трудом могу держать глаза открытыми.
3 ответа
Если у вас нет большого опыта написания серверов приложений, это непростая задача. Его можно облегчить с помощью таких сред, как ACE, которые позволяют создавать различные конфигурации инфраструктуры обслуживания приложения, такие как поток на соединение, пулы потоков, подписчик лидера, а затем загружать соответствующую конфигурацию с помощью расширяемой инфраструктуры служб.
Я бы порекомендовал прочитать эти книги на ACE, чтобы получить
- Сетевое программирование на C++: освоение сложности с использованием ACE и шаблонов
- Сетевое программирование на C++: систематическое повторное использование с ACE и Frameworks
чтобы получить представление о том, что фреймворк может сделать для вас.
То, как я пишу такие приложения, - это настраивать количество потоков с помощью командной строки и / или файла конфигурации. Затем я провожу нагрузочное тестирование с различным количеством потоков - всегда есть оптимальное число, после которого производительность начинает ухудшаться.
Если вы следуете модели, принятой разработчиками серверов приложений Java EE, есть очередь для входящих запросов и пул рабочих потоков для их обслуживания. Это один поток на запрос. Когда рабочий поток выполняет запрос, он возвращается в пул. Если входящие запросы отображаются быстрее, чем пул рабочих потоков может их обслуживать, очередь позволяет им складываться, пока рабочий поток не будет освобожден. И размер очереди, и пул потоков можно настроить в соответствии с вашей ситуацией.
Я удивляюсь, почему кому-то нужно писать свой собственный сервер с нуля, особенно когда сценарий, который вы описываете, так хорошо решается другими. Если вы хотите получить образование, удачи. Если вы думаете, что собираетесь улучшить то, что было сделано в прошлом, я бы пересмотрел это предположение.