Создание высокопроизводительного сетевого сервера на C

#c #linux #network-programming #boost-asio

#c #linux #сетевое программирование #boost-asio

Вопрос:

Мне нужно создать сетевой сервер на C для торгового приложения. Этот сетевой сервер должен выполнять следующие задачи:

  • управляйте аутентификацией клиентов и предоставляйте идентификатор сеанса для каждого сеанса.

  • обрабатывать заказы, исходящие от клиентов, и информировать клиентов об их выполнении.

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

Я планирую использовать Boost.Сетевая библиотека Asio и буферы протокола Google для реализации сообщений, отправляемых от клиентов на сервер. Подходы, основанные на XML-RPC или SOAP, строго запрещены, поскольку задержка вызывает большую озабоченность.

У меня есть следующие вопросы к сообществу stackoverflow:

  1. Хорошая ли идея реализовать эти сообщения с использованием буферов протокола? Я также рассматриваю возможность отправки библиотеки сериализации сообщений Boost для реализации этого. Когда я смотрю на код, я чувствую себя более уверенно в реализации этого с помощью сериализации boost, а заголовки Google protobuf выглядят слишком тяжеловесными. Какой из этих методов будет а) более удобным в обслуживании и б) потребует меньше усилий? Я предполагаю, что оба эти подхода будут работать на разных платформах.

  2. Есть ли какая-либо другая сетевая библиотека, на которую я должен обратить внимание, кроме Boost.Asio.? Я нахожу ACE немного устаревшим в том, что касается стиля кодирования на C .

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

  4. Кто-нибудь знает о хорошем сетевом проекте с открытым исходным кодом, в котором мог быть реализован аналогичный сетевой сервер с использованием Boost.Asio, откуда черпать вдохновение?

Комментарии:

1. Взгляните на cpp-netlib .

2. Возможно, вам стоит подумать о включении ssl раньше, чем позже. Я не знаю слишком много трейдеров, которые будут рады всем их ордерам на покупку и продажу, размещенным в сети. Но я, вероятно, ошибаюсь: может быть, это просто потому, что единственные трейдеры, которых я знаю, — это параноидальные, подозрительные, недалекие трейдеры, которые носят темные очки и носят заряженный пистолет.

3. Несколько вопросов. Сколько клиентов будет подключено к серверу? Остаются ли клиенты подключенными после выполнения транзакции? Как вы думаете, почему SOAP добавит слишком много задержек? Какая ОС — Linux, Windows Server или что-то еще?

4. Да, определенно, лучше использовать SSL раньше, чем позже.

5. Насколько клиенты чувствительны к задержкам? Какова ожидаемая пропускная способность? К чему вы собираетесь подключаться на серверной части? Собираетесь ли вы обеспечить время и продажи?

Ответ №1:

Вам также следует обратить внимание на Apache Thrift (созданный Facebook) или Apache Etch (первоначально разработанный Cisco). Это RPC-фреймворки, которые упрощают разработку как серверов, так и клиентов, отвечающих вашим потребностям (более или менее). Для фреймворка, разработанного с использованием protobuf и boost.asio, посмотрите на проект server1 .

Комментарии:

1. Я должен также упомянуть Ice от ZeroC , который представляет собой аналогичный полнофункциональный фреймворк, поддерживающий сериализацию protobuf. Он доступен под лицензией GPL v2 или коммерческой.

Ответ №2:

BSON ( http://www.mongodb.org/display/DOCS/BSON и http://bsonspec.org ) — это очень быстрый двоичный протокол. Реализация C легко доступна в mongodb. Тот факт, что это в основном JSON, делает его довольно простым в реализации и обслуживании.

Реализация SSL не добавляет много дополнительного кода к серверу на основе asio: инициализация контекста SSL с путями сертификатов и некоторой логикой квитирования.

Ответ №3:

Вам следует заглянуть в MessagePack http://msgpack.org /

Ответ №4:

Если вам разрешено приобретать готовую библиотеку для работы в сети, тогда взгляните на JetBytes Server Framework для ваших сетевых нужд. Я помню, как читал, что он выполнил тяжелую работу для PayPoint. Лен Холгейт (человек, стоящий за компанией и библиотекой) активно участвует в этих форумах, чтобы.

Комментарии:

1. Это только для Windows. Мы полностью специализируемся на Linux.

2. Вы никогда не упоминаете об этом в своем вопросе.

3. Извините за это. Мне казалось, я где-то упоминал об этом в комментариях. Моя ошибка.

Ответ №5:

Взгляните на www.zeromq.org

Это не совсем то, что вы просили, но это то, что окончательно решит вашу проблему и ускорит вашу разработку.

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

Он также используется во многих торговых серверах.

Комментарии:

1. 1 за упоминание 0mq. Хотя я бы не рекомендовал его для среды Windows из-за отсутствия поддержки перекрывающихся портов завершения ввода-вывода.

Ответ №6:

Я немного опаздываю на вечеринку, но я хотел бросить POCO (http://pocoproject.org /) тоже на ринг. Я не буду говорить, что это лучше, чем ASIO (потому что это не так), но это так же хорошо. И если вы не являетесь богом шаблонов — вы найдете POCO восхитительным. Определенно лучший выбор, чем ACE, который становится немного длинноватым.

Комментарии:

1. Почему Poco не лучше, чем Boost asio? Я еще не пробовал Poco, но, как мне кажется из документации, это гораздо более универсальная платформа для создания любых серьезных сетей, чем boost.

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

Ответ №7:

следующие задачи:

  • управляйте аутентификацией клиентов и предоставляйте идентификатор сеанса для каждого сеанса.

Если у вас изначально есть SSL, у вас может быть аутентификация сервера и клиента, которая выполнит эту задачу без необходимости добавлять дополнительные пользовательские аутентификации в ваши клиент / серверные приложения.

Комментарии:

1. Извините, я не смог понять часть «проблема а». Не могли бы вы подробнее рассказать об этом?