加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails中使用POST进行持久/保持活动的HTTP连

发布时间:2020-12-17 02:39:56 所属栏目:百科 来源:网络整理
导读:有没有办法在rails中维护/使用POST命令的持久连接? 我想创建一个API,我的应用程序接受来自外部服务的数据流(我正在编写这个外部服务,所以我可以灵活地设计我的设计).速度至关重要.我需要以每秒1000点的速度从外部源获取信息.与一些计算机科学家交谈时,人们
有没有办法在rails中维护/使用POST命令的持久连接?

我想创建一个API,我的应用程序接受来自外部服务的数据流(我正在编写这个外部服务,所以我可以灵活地设计我的设计).速度至关重要.我需要以每秒1000点的速度从外部源获取信息.与一些计算机科学家交谈时,人们提出了使用持久连接的想法,这样昂贵的TCP握手只需要执行一次.使用外部服务中的库,然后我将创建多个POST项目,这些项目被推送到我的rails应用程序中,然后逐个处理这些POST项目.

我对rails范例的理解是每个请求(POST,GET,PUT等)都需要一个TCP连接.有没有办法利用一个TCP连接获得多个POST?

我目前正在使用以下内容:

> Rails 3.2
> Ruby 1.9.3(必要时可以切换到2.0)

编辑

为了帮助澄清我的目标:

我有一个外部系统,每秒收集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校验和.这允许速度提升(并节省几个字节).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读