2013-07-21 28 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