Mandrill-api Excon::Errors::SocketError

Posted

技术标签:

【中文标题】Mandrill-api Excon::Errors::SocketError【英文标题】: 【发布时间】:2013-07-20 05:49:39 【问题描述】:

我在 Ruby 中使用 Mandrill-api 以编程方式发送交易电子邮件。

我的 rails 应用程序中有(或多或少)以下行,

mandrill ||= Mandrill::API.new const(:API)[:MANDRILL_APIKEY]
... (constructing the message, content, etc)
mandrill.messages.send_template templ, template_content, message, true

问题是在生产中运行时,它返回以下错误偶尔

Excon::Errors::SocketError (EOFError (EOFError)):
app/mailers/mailer.rb:24:in `send'
....

我不知道如何调试这个问题。如果有人可以让我了解调试此方法的方法,我将不胜感激。

宝石信息:

mandrill-api (1.0.33) excon (0.16.10)

生产环境:

 sudo bundle exec rake RAILS_ENV=production about


About your application's environment
Ruby version              1.9.3 (x86_64-linux)
RubyGems version          1.8.11
Rack version              1.4
Rails version             3.2.13
Active Record version     3.2.13
Action Pack version       3.2.13
Active Resource version   3.2.13
Action Mailer version     3.2.13
Active Support version    3.2.13
Middleware                Rack::Cache, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001e72330>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch::BestStandardsSupport
Environment               production
Database adapter          mysql2

运行时间:

Apache 服务器:Apache/2.2.22 (Ubuntu)

乘客:3.0.14

【问题讨论】:

如果您能提供一些有关您的生产环境的信息,帮助会容易得多。 泰勒,添加了生产环境。让我知道是否有其他特定信息可以帮助调试。谢谢。 【参考方案1】:

这很可能是套接字超时。 Excon 尽可能地尝试使用持久连接,但不幸的是,有时这又会咬我们一口。看来 mandrill-api 正在尝试在其调用方法中重用相同的连接/套接字:https://bitbucket.org/mailchimp/mandrill-api-ruby/src/03e3e28e77dcba31eab7d2f9e2216b5a01d2110d/lib/mandrill.rb?at=master#cl-35

这通常应该没问题,但如果给定会话存在较长时间(即猜测可能大于 30 秒),可能会导致您在上面看到的行为。在 excon 连接上调用 #reset 将确保您不会遇到这种情况,因此这可能是最安全的方法(尽管这会阻止使用持久连接,因此如果您正在执行大量请求,则会对性能造成很小的影响)。

我希望这会有所帮助,也许我们应该与 mandrill-api 讨论更新这个问题。考虑到所涉及的性能影响,可能只取决于问题的间歇性(或非间歇性)。希望对您有所帮助,但当然很乐意尽我所能讨论/提供帮助。

【讨论】:

【参考方案2】:

考虑到它是一个 EOF 错误并且是间歇性的,这可能与保持套接字在过期后保持打开状态有关。

是否有任何设置可以为每个请求打开一个新套接字,而不是重复使用同一个?

【讨论】:

为什么要检查这个作为答案?它提供了一个潜在的搜索方向,但这只是一个问题(最好作为对原始帖子 IMO 的评论)。我也遇到了同样的错误——间歇性的——我也很想看到答案。 @orangechicken,你有没有弄清楚是什么原因造成的? @Accipheran:我不相信我做到了。我已经从当时使用的版本升级,并且认为我从那时起就没有注意到问题(但这可能只是一个可见性问题)。

以上是关于Mandrill-api Excon::Errors::SocketError的主要内容,如果未能解决你的问题,请参考以下文章

通过 Mandrill NodeJS API 发送时我没有收到电子邮件

Mandrill API 使用 Rails 4.2.5 Excon::Errors::SocketError