<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cakejuju (Joey)</title>
    <link>https://ruby-china.org/cakejuju</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>如何关闭 Faraday (Net::http) 在 readtime_out 时会重发请求的机制</title>
      <description>&lt;h3 id="具体描述:"&gt;具体描述：&lt;/h3&gt;&lt;h4 id="用faraday发送请求时,若服务端的响应时间超过了配置faraday对象的readtime_out时间,faraday会再次发送请求，导致服务端收到两笔一样的请求。重发的动作在http的文档中并没有很清楚的说明,我是在项目运作过程中发现了这个情况，然后本地测试了一下(用faraday调用自己的服务，服务端故意加了sleep时间)。"&gt;用 faraday 发送请求时，若服务端的响应时间超过了配置 faraday 对象的 readtime_out 时间，faraday 会再次发送请求，导致服务端收到两笔一样的请求。重发的动作在 http 的文档中并没有很清楚的说明，我是在项目运作过程中发现了这个情况，然后本地测试了一下 (用 faraday 调用自己的服务，服务端故意加了 sleep 时间)。&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html" rel="nofollow" target="_blank" title=""&gt;http 参数的文档链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/81ea8d8f3a2153cbdcb10540254e94c9.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h5 id="虽然说把readtime_out这个参数设置的足够大可以很大程度上避免这个问题。但在对端服务器性能很差的时候会导致线程阻塞的时间太长。所以就想找能否强制不让faraday去重发，但始终没有找到这个参数或者配置。后来尝试用Net::http包来直接做发送，发现还是有一样的问题。因为faraday其实也是调用了Net::http中的方法。。"&gt;虽然说把 readtime_out 这个参数设置的足够大可以很大程度上避免这个问题。但在对端服务器性能很差的时候会导致线程阻塞的时间太长。所以就想找能否强制不让 faraday 去重发，但始终没有找到这个参数或者配置。后来尝试用 Net::http 包来直接做发送，发现还是有一样的问题。因为 faraday 其实也是调用了 Net::http 中的方法。。&lt;/h5&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;  &lt;span class="c1"&gt;# :yield: http&lt;/span&gt;
   &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;IOError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'HTTP session already opened'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@started&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;block_given?&lt;/span&gt;
     &lt;span class="k"&gt;begin&lt;/span&gt;
       &lt;span class="n"&gt;do_start&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;ensure&lt;/span&gt;
       &lt;span class="n"&gt;do_finish&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
   &lt;span class="k"&gt;end&lt;/span&gt;
   &lt;span class="n"&gt;do_start&lt;/span&gt;
   &lt;span class="nb"&gt;self&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_start&lt;/span&gt;
   &lt;span class="n"&gt;connect&lt;/span&gt;
   &lt;span class="vi"&gt;@started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="kp"&gt;private&lt;/span&gt; &lt;span class="ss"&gt;:do_start&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;
   &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="上面为http类中的部分方法 net::http gem的github 链接。在请求出现readtime_out时 do_start方法只调用一次,但connect方法确被调用了两次(connect方法较长,其中用socket来发请求)，关键是始终没发现为什么会这样。。"&gt;上面为 http 类中的部分方法 &lt;a href="https://github.com/smalruby/smalruby-installer-for-windows/blob/master/Ruby216_32/lib/ruby/2.1.0/net/http.rb" rel="nofollow" target="_blank" title=""&gt;net::http gem 的 github 链接&lt;/a&gt;。在请求出现 readtime_out 时 do_start 方法只调用一次，但 connect 方法确被调用了两次 (connect 方法较长，其中用 socket 来发请求)，关键是始终没发现为什么会这样。。&lt;/h5&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keep_alive_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use_ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OpenSSL&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SSL&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VERIFY_NONE&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="这是我目前所使用的配置，keep_alive_timeout可以忽略，本来以为是这个参数在作怪，因为java中有个keep_ailve的东东，但发现怎么设置也没用。"&gt;这是我目前所使用的配置，keep_alive_timeout 可以忽略，本来以为是这个参数在作怪，&lt;a href="http://www.lai18.com/content/2367965.html" rel="nofollow" target="_blank" title=""&gt;因为 java 中有个 keep_ailve 的东东&lt;/a&gt;，但发现怎么设置也没用。&lt;/h5&gt;&lt;h5 id="有熟悉faraday的朋友给出些建议吗？"&gt;有熟悉 faraday 的朋友给出些建议吗？&lt;/h5&gt;</description>
      <author>cakejuju</author>
      <pubDate>Sat, 01 Oct 2016 20:01:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/31220</link>
      <guid>https://ruby-china.org/topics/31220</guid>
    </item>
  </channel>
</rss>
