2013-07-21 26 views
5

我在Ruby中使用Mandrill-api以编程方式发送事务性电子邮件。Mandrill-api Excon :: Errors :: SocketError

我在我的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' 
.... 

我不知道如何调试此问题。如果有人能够阐明调试方法,我非常感谢。

宝石信息:

  • 山魈-API(1.0.33)
  • EXCON(0.16.10)

生产ENV:

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

+0

如果您可以提供有关您的生产环境的信息,那将会更容易。 – tyler

+0

泰勒,增加生产env。让我知道是否有其他特定信息帮助调试。谢谢。 –

回答

3

这很可能是套接字超时。 Excon试图在可能的情况下使用持久性连接,但有时这又会让我们不幸遇到麻烦。看起来mandrill-api正在尝试在其调用方法中重复使用相同的连接/套接字:https://bitbucket.org/mailchimp/mandrill-api-ruby/src/03e3e28e77dcba31eab7d2f9e2216b5a01d2110d/lib/mandrill.rb?at=master#cl-35

这通常应该没问题,但如果给定会话长时间存在,可能会导致上面看到的行为(也许大于30秒,猜测)。在excon连接上调用#reset可以确保你不会遇到这种情况,所以这可能是最安全的方法(尽管这可以防止使用持久连接,所以如果你正在做很多请求,性能会受到很小的影响)。

我希望有帮助,也许我们应该与mandrill-api讨论关于更新这个。考虑到涉及的性能问题,可能仅仅取决于问题是多么间歇(或不是)。希望有所帮助,但我肯定乐意讨论/帮助。

0

它可能有事情做与保持套接字打开超过保质,因为它是一个EOF错误是间歇性的。

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

+3

为什么选中这个答案?它为搜索提供了一个潜在的方向,但这只是一个问题(对于原始邮件IMO来说会更好)。我也得到了同样的错误 - 间歇性地 - 也很想看到答案。 – davemyron

+0

@orangechicken,你有没有想过是什么原因造成的? –

+0

@Accipheran:我不相信我做过。我已经从我当时使用的版本升级,不认为我已经注意到了问题,但(这可能只是一个可见性问题)。 – davemyron