2009-09-29 5 views
2

Мне трудно вдаваться в точный подробно о том, что нужно сделать серверу (из-за NDA, а что нет), но этого должно быть достаточно, чтобы сказать, что ему нужно обрабатывать легкий двоичный протокол со многими одновременно подключенными пользователями , ~ 20.000, где мы имеем довольно приличную оценку.Как создать сервер, который может обрабатывать 20 000 согласованных соединений?

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

Протокол очень легкий, поэтому не будет большого количества данных, проходящих через провод. Основная проблема заключается в том, чтобы одновременно открывать 20 000 гнезд.

(я знаю, что спецификации немного нечеткие, но я действительно не могу вдаваться в подробности)

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

Как это можно достичь?

+2

Этот вопрос на serverfault.com может помочь: http://serverfault.com/questions/69524/im-designing-a-system-to-handle-10000-tcp-connections-per-second-what-problems –

+0

Потрясающие! ссылка на сайт http://www.kegel.com/c10k.html в этом вопросе кажется отличным чтением, спасибо! – thr

ответ

1

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

Редактировать

Если вам нужно сделать поиск данных по индексу или что-то Mnesia также больше и поддерживает в памяти и на основе дисковой памяти и полностью распределенный, если вы в конечном итоге нужно перейти к более серверам

Некоторые реальный мир информации о возможностях обработки эрланга подключения http://www.sics.se/~joe/apachevsyaws.html

+0

Да, моя первая мысль заключалась в том, чтобы пойти в Erlang, но я только немного в этом разбирался (в основном читал/прорабатывал книгу из праг. Prog. Но ничего не делал в ней) Я уже знаю несколько программ Языки довольно хороши и делают много работы в F #, поэтому скачок к созданию реального сервера в Erlang может быть не таким? – thr

+1

Erlang и F # очень похожи, я не знаком с двоичной обработкой F #, но для Erlang быстро подбирается и вероятен лучший двоичный язык обработки, который я когда-либо использовал (насколько мне известно)) –

4

Если вы не должны проходить через брандмауэр, рассмотреть возможность использования протокола, основанного на UDP. NFS - хороший пример протокола на основе UDP. UDP не имеет накладных расходов на установку TCP и может масштабироваться до более 65 тыс. Параллельных подключений. Однако, если вам нужна гарантированная доставка, вам нужно будет создать эту функциональность в приложении.

Для работы с большими пользовательскими базами следует использовать архитектуру сервера на основе неблокирующего ввода-вывода.

Другой предмет, на который стоит обратить внимание, - Adaptive Communications Environment (ACE) Дугласа Шмидта. Это зрелая платформа C++ для создания высокопроизводительных серверов, в основном направленных на телекоммуникационные приложения. Он поддерживает множество моделей потоковой обработки и обрабатывает большинство сложных вещей для вас. Вы можете обнаружить, что время, затрачиваемое на начальное обучение тому, как управлять им, будет сэкономлено с уменьшением усилий отладки при проблемах с грязной синхронизацией.

+0

Этот неблокирующий ввод-вывод - это путь, который я уже понял, я даже не думал о UDP, спасибо за эту идею! И да, мне нужна гарантированная доставка, но я полагаю, что это «довольно» легко построить в самом приложении. Очень хорошая идея о UDP, спасибо! – thr

+0

в интрасети с низким трафиком, UDP allmost никогда не упаковывал пакеты. Потеря пакетов происходит только в том случае, когда происходит трафик TCP-IP, маршрутизаторы и ОС затем выбирают сначала отказаться от пакетов UDP. – Toad

+0

Построение материала повторной передачи в UDP довольно просто и может быть обработано при разработке вашего протокола. Вам все равно придется обрабатывать N параллельных операций (где N - количество клиентов, отправляющих/получающих одновременно). Таким образом, вам понадобится хорошая легкая библиотека потоковой передачи, например. pthreads (будет неуправляемым, хотя). – badbod99

2

Поддержание 20 000 подключенных разъемов не является проблемой. Вы можете сделать это с помощью C на Windows (Server) довольно легко, пока вы используете порты завершения ввода-вывода и/или API-интерфейсы threadpool.

Настоящая prblem, я думаю, генерирует данные для этих 20000 соединений.Для этого могут потребоваться некоторые экзотические решения - Erlang или что-то еще. Но сторона сокета не является тривиальной, но хорошо в рамках традиционного дизайна обслуживания.

+0

Данные * очень очень очень тонкие и будут уже уже рассчитаны, клиентам в основном нужно вытягивать разные части (индексы в огромном массиве). Не так много вычислений происходит вообще. Протокол * чрезвычайно легкий, включая данные. Проблема заключалась в одновременном хранении 20 000 подключенных клиентов. – thr

2

Взгляните на CCR от робототехники в Microsoft. Я позволяю вам программировать тип Erlang (передача сообщений, очереди и т. Д.), Но просто используя C#, а не совершенно новый функциональный язык.

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

Я использую это сам для SMS-сервера, который должен выплюнуть SMS-сообщения на смешных скоростях, и он делает это, не подчеркивая процессор на всех

+0

Прохладный! Спасибо за этот совет, мы делаем в основном .NET-программирование на C# и F #, поэтому, если бы мы могли придерживаться платформы, которую все уже знают, это сэкономит много головной боли для многих из нас! – thr

+0

Лучше всего то, что MS осознала, что часть CCR (и DSS) действительно хороша, они вырезали ее из студии робототехники. Теперь это отдельная и бесплатная загрузка – Toad

+0

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

1

Вы не делает необходимости для поддержки 20K одновременных пользователей на одном сервере. Загрузите баланс между тремя или четырьмя и подключите их к базе данных задней панели, если вы выполняете какую-либо работу с базой данных; возможно, бросить в memcache для хорошей меры, в зависимости от того, какое приложение вы строите.

+0

Почему бы не купить 20000 буровых установок, которые имеют дело только с одним соединением? Глупый ответ. -1 – spender

+1

Я не считаю это глупым ответом. Это законный вопрос: OP запросил решение, поддерживающее параллельные соединения 20k, но действительно ли это должен быть единственный сервер? – SteveD

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