【发布时间】:2012-05-01 13:31:45
【问题描述】:
我有一个执行计算量大的本地处理的程序。计算包有 16MiB 的输入缓冲区并生成 10KB 到 16MiB 的输出。这一切都发生在多线程环境中。
我有许多受计算限制的用户。我有兴趣添加对点对点多处理的支持。也就是说,客户端将在组织中的多台计算机上运行。 master 会找到可用的客户端,向它们发送 16MiB 的缓冲区,然后得到结果。
master 会有一个可用客户端的列表。然后它将向每个客户端发送一条消息,表明它是免费的。客户端将为他们拥有的每个核心启动一个线程。每个线程都会向 master 请求一个工作缓冲区,将计算结果,然后将结果发送给 master。 master 会将每个客户端的结果合并到最终输出中。
典型的运行涉及处理 100 到 50,000 个 16MiB 缓冲区。输出通常在 100MB 到 10GB 范围内。缓冲区之间没有数据依赖关系。
我正在寻找安排客户端和服务器之间通信的最佳方式。我的计划是使用某种 RPC。我不想在客户端或服务器中嵌入 Web 服务器。相反,我的计划是简单地接收 TCP 套接字上的连接并拥有某种基本的 RPC。
以下是我正在考虑的选项:
- 我可以扮演我自己的客户端/服务器系统的角色,并使用协议缓冲区将整个事物组合在一起。
- 我可以使用现有的RPC systems for potocol buffers 之一。
- 我可以嵌入 Web 服务器并使用 XMLRPC。
实现语言是 C++。该程序可针对 Linux、MacOS 和 mingw 为 Windows 编译。
谢谢。
【问题讨论】:
-
你有什么问题?无论如何,
protobuf是 C++ 编码的好选择,XML 是一个糟糕的选择。 RPC 是一个(潜在的)安全漏洞。只需在您的消息中包含一个表示“应该进行何种处理”的字段,而不是尝试传递要在远程端查找的函数名称。 -
另外,由于这是要传输的大量数据,您可能希望将传输序列化到多线程客户端,以便一个线程可以在其余工作项传输时开始工作,而不是将您的带宽分配给多个项目。
-
我的问题是“为点对点系统编写 C++ 客户端/服务器的最佳 RPC 包是什么?”
-
是的,我的客户端是多线程的。非常多线程。每个内核一个线程。
-
问题表明它是多线程的。为什么每个核心只有一个线程?因为这样他们就不会争夺 CPU 资源。这对任务的计算部分很有意义。但是对于下载部分,每个网络连接应该只有一个线程(即一次只允许一个线程下载),否则它们会争夺网络资源并减慢彼此的传输速度。
标签: c++ xml-rpc rpc protocol-buffers