ruby-on-rails – 在Rails中使用POST进行持久/保持活动的HTTP连
有没有办法在rails中维护/使用POST命令的持久连接?
我想创建一个API,我的应用程序接受来自外部服务的数据流(我正在编写这个外部服务,所以我可以灵活地设计我的设计).速度至关重要.我需要以每秒1000点的速度从外部源获取信息.与一些计算机科学家交谈时,人们提出了使用持久连接的想法,这样昂贵的TCP握手只需要执行一次.使用外部服务中的库,然后我将创建多个POST项目,这些项目被推送到我的rails应用程序中,然后逐个处理这些POST项目. 我对rails范例的理解是每个请求(POST,GET,PUT等)都需要一个TCP连接.有没有办法利用一个TCP连接获得多个POST? 我目前正在使用以下内容: > Rails 3.2 编辑 为了帮助澄清我的目标: 我有一个外部系统,每秒收集1,000个数据点(3个浮点数,一个时间戳和2个整数).我想将这些数据推送到我的Ruby on Rails服务器上.我希望配置正确的系统我可以实时使用HTTP堆栈(收集数据点后,我将其推送到我的rails服务器).我还可以降低传输速率并将数据点组合在一起发送它们.我已经看过使用消息传递队列,但我想看看在转到专门的队列API之前是否可以编写更“标准”的HTTP API. 解决方法
我认为
Net::HTTP::Persistent库是您正在寻找的.还有
this库通过在持久连接上实现连接池而更进了一步.但是,因为听起来你只有一个API点,这可能是过度的.
一些额外的想法:如果您真的关注原始速度,可能值得发送单个多部分POST请求以进一步减少开销.这将归结为实施reverse server push. 为此,您的rails应用程序需要接受chunk-encoded请求.这很重要,因为我们不断地将数据流式传输到服务器,而不知道最终消息体最终会持续多长时间. HTTP / 1.1要求所有消息(即响应和请求)要么是块编码的,要么是其内部大小由Content-Length头指定(参见RFC 2616,section 4.4).但是,大多数客户更喜欢后一种选择,这导致一些网络服务器没有很好地处理块编码的请求(例如,nginx没有在v1.3.9之前实现这一点). 作为一种序列化格式,我可以安全地推荐JSON,它真的很快生成并被广泛接受.可以在here找到RoR的实现.您可能希望查看this实现,以及它本身使用流,因此可能更适合.如果您发现JSON不适合您的需求,请尝试MessagePack. 如果您达到网络饱和度,则可能值得研究request compression的可能性. 所有东西放在一起,你的请求可能看起来像这样(压缩和块编码剥离为了易读性): POST /api/endpoint HTTP/1.1 Host: example.com Content-Type: multipart/mixed; boundary="---boundary-" Transfer-Encoding: chunked Content-Encoding: deflate ---boundary- Content-Type: application/json {...} ---boundary- Content-Type: application/json {...} ---boundary--- 哑剧类型是多部分/混合,因为我觉得它是最合适的.它实际上意味着消息部分具有不同的内容类型.但据我所知,这是无处可执行的,所以multipart / mixed在这里使用是安全的. deflate是通过gzip选择的压缩方法,因为它不需要生成CRC32校验和.这允许速度提升(并节省几个字节). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |