Создание высокопроизводительного сетевого сервера в С++
Мне нужно создать сетевой сервер на С++ для торгового приложения. Сетевому серверу необходимо выполнить следующие задачи:
-
обрабатывать аутентификацию клиентов и предоставлять идентификатор сеанса для каждого
сессии.
-
обрабатывать заказы, исходящие от клиентов, и информировать клиентов о
их исполнение.
-
обрабатывает другой запрос данных, запрошенный клиентами, и отправляет данные обратно
к ним.
Я планирую использовать сетевую библиотеку Boost.Asio и буферы протокола Google для реализации сообщений, отправляемых от клиентов на сервер. Подходы, основанные на XML-RPC или SOAP, - это строгое отсутствие-нет, поскольку задержка является большой проблемой.
У меня есть следующие вопросы для сообщества stackoverflow:
-
Это хорошая идея для реализации этих сообщений с использованием протокола
буферы? Я также рассматриваю возможность отправки сообщений.
библиотеки для ее реализации. Когда я смотрю на код, я нахожусь
более уверенно в реализации этого с повышением сериализации и
Заголовки Google protobuf выглядят слишком тяжело. Какой из этих методов
будет: a) более ремонтопригодным и b) потребует меньше усилий? Я полагаю,
оба этих подхода будут работать на разных платформах.
-
Есть ли какая-либо другая сетевая библиотека, на которую я должен смотреть отдельно
от Boost.Asio.? Я нахожу ACE немного датированным, насколько С++-кодирование
стиль.
-
В конце концов, я хочу, чтобы этот сетевой сервер работал на SSL,
однако у меня нет опыта внедрения SSL. Как
много усилий потребовалось бы для перехода на SSL позже. Должен ли я начинать
с SSL или его можно добавить позже?
-
Кто-нибудь знает о хорошем проекте с открытым исходным кодом, который может
реализовали аналогичный сетевой сервер, используя Boost.Asio, чтобы получить
вдохновлен?
Ответы
Ответ 1
Вы также должны посмотреть Apache Thrift (созданный в Facebook) или Apache Etch (первоначально разработанный Cisco). Они являются средами RPC, которые облегчают разработку как серверов, так и клиентов, удовлетворяющих вашим потребностям (более или менее). Для структуры, разработанной с использованием protobuf и boost.asio, просмотрите проект server1.
Ответ 2
BSON (http://www.mongodb.org/display/DOCS/BSON и http://bsonspec.org) - очень быстрый бинарный протокол. Реализация С++ легко доступна из mongodb. Тот факт, что это в основном JSON, довольно легко реализует и поддерживает.
Реализация SSL не добавляет много дополнительного кода для сервера на основе asio: инициализация контекста SSL с помощью путей сертификата и некоторая рукопожатие.
Ответ 3
Вы должны посмотреть в MessagePack http://msgpack.org/
Ответ 4
Если вам разрешено приобретать библиотеку полки для сети, посмотрите на JetBytes Server Framework для ваших сетевых потребностей. Я помню, что читал, что это тяжелый подъем для PayPoint. Лен Холгейт (человек, стоящий за компанией и библиотекой) активен на этих форумах.
Ответ 5
Взгляните на www.zeromq.org
Это не совсем то, что вы просили, но это то, что окончательно решит вашу проблему и ускорит ваше развитие.
zeromq - это легкая очередь сообщений с множеством разных транспортов, и у нее есть привязки для большого количества языков.
Он также используется во многих торговых серверах.
Ответ 6
Я немного опаздываю на вечеринку, но я хотел бросить POCO (http://pocoproject.org/) на ринг. Я не скажу, что это лучше, чем ASIO (потому что это не так), но это так же хорошо. И если вы не бог шаблона, вы найдете POCO восхитительным. Определенно лучше, чем ACE, который немного длиннее в зубе.
Ответ 7
следующие задачи:
- обрабатывать аутентификацию клиентов и предоставлять идентификатор сеанса для каждого сеанса.
Если у вас есть SSL с самого начала, вы можете иметь сервер и клиентское удостоверение, которое будет охватывать
эта задача без необходимости добавлять дополнительные пользовательские auth к вашим приложениям клиент/сервер.