2013-07-21 20 views
5

RubyでMandrill-apiを使用してプログラム的にトランザクションメールを送信しています。Mandrill-api Excon :: Errors :: SocketError

私は

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

おそらくソケットのタイムアウトです。エクソンは可能な限り永続的な接続を試みますが、時にはこれが私たちに不幸にも噛み付くように戻ってきます。 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