Mandrill-api Excon::Errors::SocketError
Я использую Mandrill-API в Ruby для программной отправки транзакционной электронной почты.
У меня есть (более или менее) следующая строка в моем приложении 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 Server: Apache / 2.2.22 (Ubuntu)
Пассажир: 3.0.14
2 ответа
Это скорее всего тайм-аут сокета. Excon пытается использовать постоянные соединения, когда это возможно, но иногда это, к сожалению, возвращает нас к укусам. Похоже, что mandrill-api пытается повторно использовать то же соединение / сокет в своем методе вызова: https://bitbucket.org/mailchimp/mandrill-api-ruby/src/03e3e28e77dcba31eab7d2f9e2216b5a01d2110d/lib/mandrill.rb?at=master#cl-35
Обычно это должно быть хорошо, но может привести к поведению, которое вы видите выше, если данный сеанс живет дольше (например, вероятно, более 30 секунд, по предположению). Вызов #reset для соединения excon гарантирует, что вы не столкнетесь с этим, так что это, вероятно, самый безопасный способ (хотя это предотвращает использование постоянных соединений, поэтому при выполнении большого количества запросов будет небольшой удар по производительности.).
Надеюсь, это поможет, возможно, нам следует обсудить с Mandrill-API обновление этой версии. Может зависеть от того, насколько неустойчива (или нет) проблема, учитывая вовлеченную производительность. Надеюсь, что это помогает, но, безусловно, рад обсудить / помочь, как я могу.
Это может быть связано с тем, чтобы сокет оставался открытым после истечения срока его действия, учитывая, что это ошибка EOF и она прерывистая.
Есть ли какие-либо настройки для открытия нового сокета с каждым запросом, вместо повторного использования одного и того же?