Масштабируемая реализация Delphi TCP-сервера - PullRequest
8 голосов
/ 22 августа 2011

Какие-либо предложения для компонентов, чтобы использовать в качестве основы для масштабируемого TCP-сервера? В настоящее время у меня есть реализация, которая использует Indy, которая хорошо работает, скажем, для 100 относительно активных соединений или 1000 относительно неактивных соединений, но один поток на модель соединения ограничивает количество одновременных активных соединений, которые могут быть обработаны.

Допустим, моя цель - 1000 соединений, каждое из которых обрабатывает 10 сообщений в секунду, или 10000 соединений, каждое из которых обрабатывает 1 сообщение в секунду на хорошем сервере (8–16 ядер). Это реалистично? Мне бы очень хотелось услышать о любых реальных реализациях, потому что я обнаружил, что то, что может работать в теории, не обязательно работает на практике, и я не хочу гоняться за предлагаемым решением, которое не будет работать.

Редактировать: IOCP было бы хорошо, но я хочу использовать только классы / компоненты коммерческого уровня, поэтому они должны быть такими же "профессиональными", как Indy или IP * Работает, прежде чем я подумаю об использовании их. Более того, я не собираюсь «раскручивать собственное» решение - потребуется слишком много времени, чтобы сделать его коммерческим. Наконец, я ищу существенное улучшение того, что у меня уже есть. Я уверен, что смогу выжать как минимум на 20-50% больше того, что у меня есть (на основе Indy), но я никогда не смогу обработать 10 000 одновременно работающих клиентов или 10 000 сообщений в секунду, как бы я ни старался , Есть ли что-то там, что отвечает этим условиям - другой вопрос.

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

Ответы [ 6 ]

3 голосов
/ 23 августа 2011

Существует проект в http://voipobjects.com/, который основан на предыдущем iopcclasses проекте.

Он утверждает, что обрабатывает тысячи одновременносоединения :

Механизм IOCP представляет собой набор классов, компонентов и процедур для быстрого создания высокопроизводительных и высокопроизводительных приложений TCP / UDP.Приложение, созданное с использованием классов IOCP, может обрабатывать тысячи одновременных соединений.

Библиотека написана на Delphi - поддерживаются Delphi 7 - 2010.

Библиотека использует технологию портов завершения IO.В мире Win32 существует самая мощная технология для создания масштабируемых и высокопроизводительных приложений TCP / UDP.Эта технология поддерживается во всех настольных ОС Windows, кроме старых версий Win9x / WinME.

Эта библиотека лицензирована под MPL1.1.Также включает в себя некоторые файлы из проекта Jedi (перевод заголовка Winsock2).

https://bitbucket.org/voipobjects/iocpengine

2 голосов
/ 23 августа 2011

Мой любимый сетевой уровень Delphi - ICS от Francois Piette .Это фантастически легко понять, очень масштабируемое и сверхвысокая производительность.Бесплатно и с открытым исходным кодом.Вероятно, будет масштабироваться до 1000 клиентов для большинства людей, без значительных усилий и без сложности, которая доставляет мне проблемы при использовании Indy.

Я получил увеличение масштабируемости / производительности на 20% благодаря переключению всех своих вещей с Indyв ICS.

1 голос
/ 22 августа 2011

Реальный решающий факт - то, что вы планируете делать с каждой из этих транзакций.

Я использую Indy с сетевыми серверами Windows с балансировкой нагрузки. Одно из этих приложений Delphi обслуживается 3 физическими серверами, которые прослушивают один общедоступный IP-адрес, где со вчерашнего дня мы получили миллионы запросов с нулевыми ошибками. Загрузка за ночь довольно простаивает, поэтому фактические запросы составляют около 350 / сек / сервер в течение дня, и есть много возможностей для роста.

Если для каждой транзакции не требуется много ЦП / памяти, вы можете использовать ее на одном компьютере с помощью Indy. Все зависит от нагрузки ... так как вы, вероятно, не можете записывать в 1000 разных файлов каждую секунду.

Есть и другие вещи, о которых нужно беспокоиться - например, ОС, поддерживающая такое количество активности. Возможно, вам придется настроить некоторые параметры реестра. (см. этот вопрос stackoverflow )

IOCP - это путь для сверхмощных серверов. Я использовал Indy для простоты использования в реализации / отладке в течение очень долгого времени. У меня есть своя собственная реализация IOCP, которую я написал несколько лет назад, но никогда не выпускал ее в производство, так как нам это просто не нужно.

Мой простой совет - я бы настоятельно рекомендовал развернуть его в Indy, используя NLB в качестве опоры для нагрузки, и после этого, если вы все еще хотите достичь максимальной скорости, напишите свою собственную реализацию IOCP, чтобы вы могли обработать ее в своей особые требования. Обратите внимание, что это основано на незнании фактических требований реализации.

1 голос
/ 22 августа 2011

Вы должны посмотреть на RealThinClient SDK http://www.realthinclient.com/about.htm

Хорошо проверенное решение. Хорошая поддержка. Результаты тестов для различных серверных решений на домашней странице.

0 голосов
/ 23 августа 2011

Я использую ICS в течение последних 12 лет. Это не блокирует. Я поддерживаю до 2000 одновременных подключений, каждое из которых получает по меньшей мере 5000 байт в секунду, отправляемых как 1000 байт каждые 200 мсек. Никогда не сталкивался с какими-либо проблемами, и использование приложения процессором очень мало. Хорошая поддержка на форуме, но совсем не требуется.

Shekar

0 голосов
/ 23 августа 2011

Я попробовал несколько решений Delphi для создания сетей и обнаружил, что многие, если не все, решения добавляют сложность и код, которые влияют либо на производительность, либо на занимаемую площадь, либо на то и другое. Поэтому я начал искать самую легкую оболочку вокруг Winsock API. Я обнаружил собственные компоненты Delphi TTcpClient и TTcpServer. При использовании в режиме блокировки и переопределении TCustomTcpServer, переопределяющем метод DoAccept, у меня были лучшие результаты до сих пор.

Если вы ожидаете, что будет действительно большое количество входящих подключений и (небольших) ответов для обслуживания (небольших) запросов, настоятельно рекомендуется реализовать портов завершения ввода / вывода , поскольку это обрабатывает входящие запросы лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...