我有一个应用程序,我想在其中通过网络将其可变状态的一部分发送到另一台机器(将有这些机器的集群)以在其上执行一些 CPU 密集型计算并取回结果.就像异步 RPC。这样的调用在程序执行过程中会发生很多次,所以我想尽可能地减少开销,例如最小化数据冗余拷贝的数量。数据的大小从几十字节到几百KB不等,甚至可能只有几MB。它的结构比较复杂,由一组对象树组成,但叶子只包含基本类型,内部节点包含最少的元数据。
我正在考虑使用 Cap'n Proto 进行序列化(不过,在这种情况下,我必须为我的数据创建一个冗余模型),以及使用 ZeroMQ 进行传输。在客户端/主应用程序方面,我想使用 azmq,因为我需要 Boost:Asio 的功能(即协程/纤程支持)。语言是 C++。
用一个非常粗略的草图总结:
RelativelyComplexState data;
CapnProtoRequest cp_req = buildRequest(data); // traverses my data, creates C'n P object
azmq_socket.async_send(boost::asio::buffer(cp_req, cp_req.size)); //azmq always copies the buffer? Not good.
// do other stuff while request is being processed remotely
// get notification from azmq/Boost:Asio when reply has arrived
azmq::message msg();
azmq_socket.async_receive(some_message_handler?); // get all the data into msg
CapnProtoResponse cp_resp = parseResponse(msg.cbuffer()); // interpret bytes as C'n P object, hopefully no copy
RelativelySimpleResult result = deserialize(cp_resp);
这样可行吗,或者有更好的办法吗?在这种情况下,无模式序列化方法(即 Boost::Serialization)是否会让我的生活更轻松和/或应用程序更高效?
此外,使用 ZeroMQ/azmq 发送和接收 Cap'n Proto 对象的最佳方式是什么,避免不必要的拷贝?通过查看 azmq 的源代码,似乎对于发送,azmq 总是复制缓冲区内容。更微妙的问题是什么(分段/框架等)?我不熟悉这些库,也没有找到任何解释或好的例子。
谢谢!
最佳答案
我不太了解 ZeroMQ 的接口(interface),但我可以就如何最小化 Cap'n Proto 的拷贝提供建议。
在发送方,使用capnp::MessageBuilder::getSegmentsForOutput() (capnp/message.h) 获取消息内容的直接指针,无需复制。这为您提供了一组字节数组(实际上是单词,但您可以将它们转换为字节)。您需要以某种方式将它们提供给 ZeroMQ 而无需复制它们。您需要确保保留段之间的边界——目标是在接收端提出完全相同的数组数组。也许 ZeroMQ 明确支持多段消息并且可以为您记住段边界;如果没有,您需要在消息前加上段大小表。
在接收端,一旦你重建了你的段数组,构造一个 capnp::SegmentArrayMessageReader (capnp/message.h) 并将数组传递给构造函数。这将在不复制的情况下使用基础数据。 (请注意,您需要确保数据在 64 位边界上对齐。我不确定 ZeroMQ 是否保证这一点。)
请注意,如果您的客户端和服务器都是 C++,您可能需要考虑使用 Cap'n Proto 自己的 RPC 协议(protocol),它更容易设置并且已经避免了所有不必要的拷贝。然而,将 Cap'n Proto 的事件循环与 boost::asio 集成目前并非易事。这是可能的——例如,您可以查看 node-capnp它将 Cap'n Proto 与 libuv 的事件循环集成在一起——但可能比您想做的要多。
(披露:我是 Cap'n Proto 的作者。)
关于c++ - 序列化可变状态并通过网络异步发送它,几乎是零拷贝(Cap'n Proto + ZeroMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28149139/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai