【问题标题】:Best approach for small scale distributed C++ apps小型分布式 C++ 应用程序的最佳方法
【发布时间】:2010-11-14 11:02:57
【问题描述】:

我正在开发一个独立的应用程序。应用程序的每个实例都必须能够发送和接收查询。

要求:

  1. 语言 - C++
  2. 规模 - 小。一次可能是 5 个实例
  3. 独立于平台
  4. 预计传输的数据量会很大(最坏情况下为原始图像)

我不想使用 RPC,因为它需要运行注册表服务。我认为 CORBA 和 SOAP 的开销太大了。我有点决定使用自定义协议,但只是想听听是否有更好的方法。

谢谢。

【问题讨论】:

  • 如果数据量很大(并且在大块中,例如原始图像),使用 CORBA 或 SOAP 的开销会非常小。
  • 我同意 CORBA/SOAP,开销可能不会太高,但对于你想要的东西来说,它们可能都过大了。
  • @MikeArthur:同意可能的矫枉过正。
  • 了解更多有关该应用程序的信息会有所帮助。您只是流水线处理步骤吗?它是一个主/从设置,你有多个从站吗?更复杂的东西?
  • 首先,它是一个简单的请求-应答架构,每个实例都持有网络中每个其他活动实例的句柄。所有实例都是客户端和服务器。

标签: c++ soap distributed soa rpc


【解决方案1】:

Protocol Buffers 听起来很合适,受 C++ 支持,跨平台,专为高性能而设计。

【讨论】:

  • 除了 Protocol Buffers 是一种序列化/交换格式,因此在这里真的没有太大帮助,恕我直言。 (我认为这里的问题是让通信工作+稳定,而不是序列化。)
【解决方案2】:

MPI 就是为此而生的,而且肯定比 Corba 等更容易使用。
当你发现你的小规模分布式应用程序变成了一个非常大规模的分布式应用程序时,它就会扩展!

【讨论】:

  • 应该考虑 MPI。如果数据量足够大,处理量足够低,瓶颈很可能就是网络。
  • 瓶颈通常是试图理解 Corba 文档!至少 MPI 函数调用足够简单。
  • 谢天谢地,我从来不用和 Corba 打交道。 MPI 调用很简单,而且数量不多。有一些微妙之处,例如匹配发送和接收,但通常是可以管理的。
【解决方案3】:

为什么不使用http POST

  • 根据需要轻量级(打开套接字、发送 POST 字符串),或者如果您想要健壮性,请使用 http 库。
  • 易于管理服务器端的权限(只需使用 apache 或 iis)
  • 内置日志记录(在网络服务器端)
  • 没有扩展问题(网络服务器已经解决了这些问题)
  • 通常系统不需要 http 套接字的权限(xp 需要原始套接字)。
  • 用于识别字段和数据的键/值对。
  • 您可以使用 firefox 插件对其进行测试。
  • 如果担心速度,您可以轻松设置超时并重新发送。
  • 您不必担心防火墙,因为默认情况下几乎总是允许使用 http。
  • 使用端口嗅探器进行简单调试。
  • 已为您编写了所有服务器端代码和大部分客户端代码。

【讨论】:

    【解决方案4】:

    我建议将 HTTP 协议与实际嵌入在您的应用程序中的小型网络服务器一起使用。这很容易上手,而且有很多优秀的可嵌入网络服务器——我个人推荐Mongoose

    【讨论】:

    • +1 表示有趣的想法。 Wxplain,为什么将 Web 服务器放在客户端。拥有一个应用程序“打电话回家”与能够“从家里打电话”有什么优势?
    • OP 说每个实例都必须发送和接收,所以每个实例都是一个服务器,或者至少这是我的看法。
    • 每个实例都是一个服务器和一个客户端。
    • 我认为这说明服务器/客户端二分法不再完全表达正在发生的事情。例如,Web 浏览器连接到 ajax 站点、客户端或服务器。双方发起通信并相互提供数据。客户端/服务器常用于表示一个(服务器)对多个(客户端),而不是传统意义上的请求者/提供者。
    【解决方案5】:

    我想看看Spread Toolkit。嗯,它是 C,但 C++ bindings exist,而且你自己也很容易滚动。你的听起来很像一些我已经成功使用它的项目(尽管没有任何绑定)。

    来自项目的网站:

    Spread 是一个开源工具包,它提供了一种高性能的消息传递服务,该服务对跨局域网和广域网的故障具有弹性。 Spread 用作分布式应用程序的统一消息总线,并提供高度调整的应用程序级多播、组通信和点对点支持。传播服务的范围从可靠的消息传递到具有传递保证的完全有序的消息。

    Spread 可用于许多分布式应用程序,这些应用程序需要在各种成员子集之间实现高可靠性、高性能和稳健的通信。该工具包旨在封装异步网络的挑战性方面,并支持构建可靠且可扩展的分布式应用程序。

    Spread 由与用户应用程序链接的库、在处理器组的每台计算机上运行的二进制守护程序以及各种实用程序和演示程序组成。

    Spread 提供的一些服务和好处:

    • 可靠且可扩展的消息传递和群组通信。
    • 一个非常强大但简单的 API 简化了分布式架构的构建。
    • 易于使用、部署和维护。
    • 从一个局域网到复杂的广域网的高度可扩展性。
    • 支持具有不同成员集的数千个组。
    • 在出现机器故障、进程崩溃和恢复以及网络分区和合并的情况下确保消息可靠性。
    • 为消息提供一系列可靠性、有序性和稳定性保证。
    • 强调稳健性和高性能。
    • 完全分布式的算法,没有中心故障点。

    我知道,基于所有这些,听起来它一定是复杂的东西,可能对任何小项目来说都过分了——但实际上并非如此:基本用法非常简单。当然,它在底层很复杂,因为该工具包解决的问题本质上是相当困难的;但至少我从来不用看那里,就像我从来没有检查过 TCP 是如何工作的一样,尽管我一直在广泛使用它。

    (不,我不以任何方式为该项目工作。只是一个快乐的用户。)

    【讨论】:

      【解决方案6】:

      我建议您评估 deltavsoft 的 RCF,这听起来很合适,因为它是为 c++ 应用程序量身定制的,而且是免费的。

      http://deltavsoft.com/w/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多