2

我将在 Windows 上运行的 C++ 中的客户端/服务器应用程序上工作,服务器本身由“管理器”可执行文件组成,生成一次,“工作人员”可执行文件生成 1 到 29 次,具体取决于配置。

coms 位于客户端和“管理器”进程之间,“管理器”进程和“工作”进程之间(配置它们,将数据发送到进程)以及一些“工作”进程之间。附带说明:当我说工作进程时,我并不是指进程并行执行完全相同的工作以获得超级性能:它们的配置都不同,做不同的工作,性能真的不是问题。这里的几个过程中的分离更多是关于稳定性。

现在我不知道选择什么网络库来做这一切。

我知道 boost::asio,我熟悉 boost 和它的特殊风格,但恐怕我团队的其他成员不熟悉。我还被建议使用 zeroMq。我已经看到了其他一些人的优点和缺点。但我有点失落!

使用 zeroMq,我认为我们失去了 asio 的 proactor?所以从某种意义上说它感觉它是低级的?另一方面,它提供了我认为对我们没有用的发布/订阅等功能。

这些库都不会帮助我们处理序列化部分(交换的数据是异构的)。我在想谷歌协议缓冲区可以在这一点上帮助我们,除非周围有一个全能库?

我们隐约考虑过的其他选择是 Corba、amqp。前者感觉笨拙,我们被建议不要这样做。后者感觉过于复杂。(?)

有什么建议吗?

4

2 回答 2

3

如果您选择走那条路,ZeroMQ可以与 Boost.Asio 完美集成。也就是说,如果你熟悉的话,我建议你使用 Boost.Asio 来实现你的客户端和服务器。这是一个写得很精彩的库,有据可查,如果你有问题,它有一个活跃的用户社区(就是我们)。

根据我的经验,大多数倾向于回避 Asio 的开发人员不熟悉非阻塞 I/O,并且更喜欢使用每个连接线程的方法来孤立他们的设计,这种方法不会超出琐碎的示例。将您的同事指向Asio 示例,将他们发送到 StackOverflow,以便他们阅读标签中的问题。如果他们仍然不相信,也许向他们展示基于 Asio的TR2 网络库提案,它可能会在某一天最终成为标准。

于 2013-03-07T23:38:25.160 回答
0

使用 ZMQ,您可能希望使用发布/订阅模型(与 zmq 2.2 相比,在 zmq 3.x 中特别有效,因为 3.x 执行基于发布的订阅过滤,而 2.2 执行基于客户端的过滤)。

所有工作人员都将使用 SUB 套接字连接到管理器(无论他们是什么类型的工作人员)并订阅它需要处理的消息。管理器将绑定一个 Pub 套接字并推送它从客户端接收到的所有消息。工作人员只会收到它订阅的消息。这是非常有效的,老实说,这是我实现这种行为的方式。

如果您有多个工作人员处理相同的消息(出于性能考虑),您需要创建一个中间“工作人员”来订阅该特定消息类型并绑定一个 PUSH 套接字,相同类型的工作人员将连接到该套接字带有 PULL 套接字的中间“工人”(也称为路由器)。这样,传入的消息将在每个工作人员完成一项任务时“排队”并散开。

我可能会从一开始就创建那个中间步骤,这样你就可以在没有太多问题的情况下开箱即用(如果真的需要的话)。

于 2013-03-07T17:42:44.463 回答