Создание высокопроизводительного сетевого сервера на C ++ - PullRequest
16 голосов
/ 04 октября 2011

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

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

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

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

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

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

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

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

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

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

Ответы [ 7 ]

4 голосов
/ 04 октября 2011

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

3 голосов
/ 04 октября 2011

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

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

2 голосов
/ 05 октября 2011

Вы должны посмотреть в MessagePack http://msgpack.org/

1 голос
/ 20 февраля 2013

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

1 голос
/ 06 октября 2011

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

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

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

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

1 голос
/ 05 октября 2011

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

0 голосов
/ 04 октября 2011

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

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

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

...