来自客户端的不同 IP 的重复请求导致 Ruby on Rails 3.2 控制器中的重复操作

来自客户端的不同 IP 的重复请求导致 Ruby on Rails 3.2 控制器中的重复操作

我一直在尝试弄清楚这个问题,重新检查我的代码并在互联网上搜索,我发现了一些可能的答案,如果原因是其他原因,但没有完全像我这里的那样,所以我想是时候发布我的第一个问题了,希望这不属于 stackoverflow.com:

在下面的日志文件中,客户端似乎同时使用不同的 IP 发送了对同一资源的两个请求。对于此客户端,每个客户端都有一个唯一的 ID“12345”。我的工作流程的一部分是,当我们到达最后一页,第 8 页 ->“/app/page/8/12345”时,应用程序会发送一封电子邮件。

据我所知,这些对应用程序的重复请求是导致我的控制器中出现重复操作并导致重复电子邮件的原因。

所以我的问题是,是什么原因导致了这些重复的请求,我该怎么办?

  1. 难道真的是客户端发送了两个请求,可能是因为他们配置了两个 IP,或者也许他们正在通过 VPN,并且两个 IP 都在我的服务器上可见?
  2. 这可能是我忽略的 Apache 或 Passenger Standalone 上的配置问题。
  3. 是否有标准方法来处理这些类型的请求,这是我第一次看到这种类型的问题。

这种情况不会发生在每个请求或每个用户身上,只是似乎发生在某些用户身上。当我测试时,当我点击浏览器的“提交”按钮时,日志文件只显示一个请求,没有重复的请求。

日志档案:

.
.
.
.

Started GET "/app/page/5/12345" for 189.19.xxx.xxx at 2013-02-17 22:44:46 -0800
Processing by MainController#page as */*
  Parameters: {"page_no"=>"5", "id"=>"12345"}


Started GET "/app/page/5/12345" for 184.102.xxx.xxx at 2013-02-17 22:44:46 -0800
Processing by MainController#page as HTML
  Parameters: {"page_no"=>"5", "id"=>"12345"}
  Rendered main/_range_table.html.erb (7.1ms)
  Rendered main/_range_table.html.erb (7.2ms)
  Rendered main/page.html.erb within layouts/main (18.3ms)
Completed 200 OK in 29ms (Views: 17.5ms | ActiveRecord: 4.2ms)
  Rendered main/page.html.erb within layouts/main (17.6ms)
Completed 200 OK in 26ms (Views: 17.2ms | ActiveRecord: 3.3ms)


Started POST "/app/page/5/12345" for 184.102.xxx.xxx at 2013-02-17 22:44:57 -0800
Processing by MainController#page as HTML
  Parameters: {"utf8"=>"?", "authenticity_token"=>"4exZYGAEcu4xffiBfh45u877bvF0zGpNXJhL98QLzy0=", "response"=>    {"43"=>"8"}, "commit"=>"Submit", "page_no"=>"5", "id"=>"12345"}
Redirected to http://<mydomain_here>/app/page/6/12345
Completed 302 Found in 24ms (ActiveRecord: 6.7ms)


Started GET "/app/page/6/12345" for 189.19.xxx.xxx at 2013-02-17 22:44:57 -0800
Processing by MainController#page as */*
  Parameters: {"page_no"=>"6", "id"=>"12345"}


Started GET "/app/page/6/12345" for 184.102.xxx.xxx at 2013-02-17 22:44:57 -0800
Processing by MainController#page as HTML
  Parameters: {"page_no"=>"6", "id"=>"12345"}

  .
  .
  .
  .
  .

谢谢任何帮助或建议为我指明正确的方向!

答案1

好的,我相信经过大量研究并重新审视我的应用程序中的遗留代码后,我已经找到了问题的答案:

  1. 这些请求来自哪里?根据我的研究和观察:

    a. 自今年年初(2013 年 1 月)以来,这些请求变得越来越频繁,但我的代码没有任何变化,似乎互联网或客户端计算机或网络基础设施发生了一些变化。我打算使用网络基础设施,可能是某种升级....参见 (b.)

    b. 在我进行在线研究时,有人提出某些代理服务器可能会重新请求其客户端请求的 URL,并执行额外的 GET 来缓存这些页面。我看到这种情况发生在初始请求后的几秒或长达 30 分钟后。

  2. 最大的问题...我发现遗留代码在 GET 请求上处理数据库更改,据我所知,这是不行的,所有数据库更改都应该仅在 POST 请求上完成。

因此基本上我的代码应该能够处理进入同一 URL 的尽可能多的 GET,而无需采取除了每次都返回相同数据且不进行数据库更新之外的任何其他操作。

所以这个问题现在已经得到纠正。希望这篇文章能帮助遇到类似问题的人!

相关内容