【问题标题】:Creating a high-performance network server in C++用 C++ 创建高性能网络服务器
【发布时间】:2011-10-04 18:10:19
【问题描述】:

我需要用 C++ 为交易应用程序创建一个网络服务器。此网络服务器需要执行以下任务:

  • 处理客户端的身份验证并为每个客户端提供会话 ID 会议。

  • 处理来自客户的订单并通知客户 他们的执行。

  • 处理客户端要求的其他数据请求并发送回数据 给他们。

我计划使用 Boost.Asio 网络库和 Google 协议缓冲区来实现从客户端发送到服务器的消息。基于 XML-RPC 或 SOAP 的方法是严格禁止的,因为延迟是一个大问题。

我对 stackoverflow 社区有以下问题:

  1. 使用协议实现这些消息是个好主意吗 缓冲区?我也在考虑发送消息Boost序列化 库来实现这一点。当我看代码时,我发现自己 更有信心通过增强序列化来实现这一点 Google protobuf 标头看起来太重了。这些方法中的哪一个 将a)更易于维护并且b)需要更少的努力?我猜, 这两种方法都适用于不同的平台。

  2. 还有其他我应该看看的网络库吗 来自 Boost.Asio.?我发现 ACE 在 C++ 编码方面有点过时 风格很重要。

  3. 最终我想让这个网络服务器在 SSL 上运行, 但是,我没有任何实现 SSL 的经验。如何 以后迁移到 SSL 需要付出很多努力。我应该开始吗 使用 SSL 还是可以稍后添加?

  4. 有谁知道一个好的开源网络项目,可能 已经使用 Boost.Asio 实现了一个类似的网络服务器,以获取 灵感来自?

【问题讨论】:

  • 看看cpp-netlib
  • 您可能希望尽快考虑包含 ssl。我不知道有多少交易者会欢迎他们在网上公布的所有买卖订单。但我可能错了:也许这只是因为我认识的唯一交易员是偏执、多疑、贴近马甲的交易员,他们戴着环绕式墨镜并携带上膛的枪。
  • 一些问题。有多少客户端将连接到服务器?客户在执行交易后是否保持连接?为什么您认为 SOAP 会增加太多延迟?哪个操作系统 - Linux、Windows Server 或其他?
  • 是的,一定要尽快解决 SSL。
  • 客户端对延迟有多敏感?预期带宽是多少?你要在后端连接什么?你会提供时间和销售吗?

标签: c++ linux network-programming boost-asio


【解决方案1】:

您还应该查看Apache Thrift(源自 Facebook)或Apache Etch(最初由 Cisco 开发)。它们是 RPC 框架,可以轻松开发满足您需求的服务器和客户端(或多或少)。对于使用 protobuf 和 boost.asio 开发的框架,请查看server1 project

【讨论】:

  • 我还应该提到Ice by ZeroC,这是一个类似的全功能框架,支持protobuf序列化。它在 GPL v2 许可或商业许可下可用。
【解决方案2】:

BSON(http://www.mongodb.org/display/DOCS/BSONhttp://bsonspec.org)是一个非常快速的二进制协议。 C++ 实现可从 mongodb 轻松获得。它基本上是 JSON 的事实使它很容易实现和维护。

SSL 实现不会向基于 asio 的服务器添加太多额外代码:使用证书路径和一些握手逻辑进行 SSL 上下文初始化。

【讨论】:

    【解决方案3】:

    您应该查看 MessagePack http://msgpack.org/

    【讨论】:

      【解决方案4】:

      如果您被允许购买现成的网络库,请查看JetBytes Server Framework 以满足您的网络需求。我记得读到它为 PayPoint 做了繁重的工作。 Len Holgate(公司和图书馆背后的人)在这些论坛上很活跃。

      【讨论】:

      • 这仅适用于 Windows。我们完全是一家 Linux 商店。
      • 你从来没有在你的问题中提到这一点。
      • 很抱歉。我以为我在某处的 cmets 中提到了它。我的错。
      【解决方案5】:

      看看 www.zeromq.org

      这并不完全是您所要求的,但它将最终解决您的问题并加速您的开发。

      zeromq 是一个轻量级的消息队列,有很多不同的传输方式,并且绑定了很多语言。

      它也用于很多交易服务器。

      【讨论】:

      • +1 用于提及 0mq。尽管由于不支持重叠 i/o 完成端口,我不建议将其用于 windows 环境。
      【解决方案6】:

      我参加聚会有点晚了 - 但我也想把 POCO (http://pocoproject.org/) 扔进擂台。我不会说它比 ASIO 更好(因为它不是),但它也一样好。如果您不是模板之神 - 您会发现 POCO 令人愉快。绝对比 ACE 更好,因为 ACE 有点长。

      【讨论】:

      • 为什么 Poco 不如 Boost asio?我还没有尝试过 Poco,但在我看来,从文档来看,它似乎是一个比 boost 更全面的平台,可以进行任何类型的严肃网络。
      • Poco 是四舍五入的,但有限。 IMO,根据我的实践,您几乎无法扩展它。遗憾的是,我不记得在我的案例中导致放弃 Poco 的一系列定制问题。
      【解决方案7】:

      以下任务:

      • 处理客户端身份验证并为每个会话提供会话 ID。

      如果您从一开始就有 SSL,那么您可以拥有服务器和客户端身份验证,这将涵盖 此任务无需向您的客户端/服务器应用程序添加额外的自定义身份验证。

      【讨论】:

      • 对不起,我无法理解“issue a”部分。你能详细说明一下吗?
      猜你喜欢
      • 2011-09-18
      • 2011-05-26
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2019-06-08
      • 2011-08-26
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多