2008-08-28 6 views
4

Я ищу любые стратегии, которые люди используют при реализации серверных приложений, обслуживающих клиентские TCP (или UDP) запросы: шаблоны проектирования, методы внедрения, лучшие практики и т. Д.Как вы минимизируете количество потоков, используемых в приложении сервера tcp?

Давайте предположим для целей этого вопроса, что запросы являются относительно долговечными (несколько минут) и что трафик чувствителен к времени, поэтому задержки при принятии сообщений не принимаются. Кроме того, мы обслуживаем запросы клиентов и делаем наши собственные подключения к другим серверам.

Моя платформа .NET. Но поскольку базовая технология одинакова независимо от платформы, мне интересно видеть ответы на любой язык.

ответ

6

Современный подход заключается в том, чтобы использовать операционную систему для мультиплексирования множества сетевых сокетов для вас, освобождая приложение только для обработки активных соединений с трафиком.

Всякий раз, когда вы открываете сокет, он связан с селектором. Вы используете один поток для опроса этого селектора. Всякий раз, когда данные поступают, селектор будет указывать активный сокет, вы передаете эту операцию дочернему потоку и продолжаете опрос.

Таким образом вам нужен только поток для каждой параллельной операции. Разъемы, которые открыты, но не работают, не будут связывать нить.

0

G'day,

Я хотел бы начать, глядя на метафоре вы хотите использовать для вашей структуры потока.

Возможно, «ведущий приверженец», где поток прослушивает входящие запросы, и когда в него поступает новый запрос, работа и следующий поток в пуле начинают прослушивать входящие запросы.

Или пул потоков, в которых тот же поток всегда прослушивает входящие запросы, а затем передает запросы на следующий доступный поток в пуле потоков.

Возможно, вы захотите посетить раздел Ace Components, чтобы получить некоторые идеи.

HTH.

веселит, Роб

4

Более sophosticated Подход будет использовать порты завершения ввода-вывода. (Windows) С портами ввода-вывода IO вы отправляетесь в операционную систему для управления опросом, что позволяет потенциально использовать очень высокий уровень оптимизации с поддержкой драйверов NIC. В принципе, у вас есть очередь сетевых операций, которые управляются ОС, и предоставляют функцию обратного вызова, которая вызывается при завершении операции. Немного напоминает (жесткий диск) DMA, но для сети.

Len Holgate написал серию eccelent на портах завершения ввода-вывода несколько лет назад на Codeproject: http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

И я нашел статью о портах завершения ввода-вывода для.net (не прочитал его хотя) http://www.codeproject.com/KB/cs/managediocp.aspx

Я бы также сказал, что легко использовать порты завершения по сравнению с попыткой и написать масштабируемую альтернативу. Проблема в том, что они доступны только на NT (2000, XP, Vista)

2

Если вы использовали C++ и Win32 напрямую, я бы посоветовал вам ознакомиться с перекрывающимися портами ввода/вывода и ввода/вывода , У меня есть свободная C++, IOCP, платформа клиент/сервер с полным исходным кодом, см. here для получения дополнительной информации.

Поскольку вы используете .Net, вы должны смотреть на использование асинхронных методов сокетов, чтобы вам не требовалось нить для каждого подключения; есть несколько ссылок из этой публикации в блоге, которые могут быть полезными отправными точками: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (некоторые из лучших ссылок находятся в комментариях к оригинальной публикации!)

 Смежные вопросы

  • Нет связанных вопросов^_^