无法通过 AWS-SES 和 Sidekiq 发送电子邮件
Cannot send emails via AWS-SES and Sidekiq
我们正在从 DelayedJob 迁移到 Sidekiq。一切似乎都很好,只是我们使用亚马逊的 SES 发送电子邮件。我认为这个问题是线程安全问题之一。
每当我们排队超过 1 封电子邮件时,我们都会遇到大量此类错误
WARN EmailJob::perform IOError closed stream #<SendMailQueueItemWorker:0x00007f7fb00b7ae8 @jid="242cafc31a55b6121959103f"> /usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:176:in `wait_readable'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:124:in `read'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:291:in `block in read_body_0'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:276:in `inflater'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:281:in `read_body_0'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:202:in `read_body'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1408:in `block in send_entity'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/gems/aws-sdk-core-3.22.1/lib/seahorse/client/net_http/patches.rb:40:in `block in new_transport_request'
或
EmailJob::perform OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=unknown state: unexpected record #<SendMailQueueItemWorker:0x000055c08033f748 @jid="47a8cdc65878dcaa9e6ad817"> /usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:44:in `connect_nonblock'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:928:in `connect'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:852:in `start'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1384:in `request'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1407:in `send_entity'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1195:in `post'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/bundler/gems/aws-ses-feac6b6b069d/lib/aws/ses/base.rb:165:in `request'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/bundler/gems/aws-ses-feac6b6b069d/lib/aws/ses/send_email.rb:103:in `send_raw_email'
该代码与多年来从 DelayedJob 内部调用的代码完全相同,没有问题。
这里有什么我们可以做的吗,还是我们回去找 DJ 打亚马逊相关的电话?我们多次调用不同的亚马逊服务。
听起来您正试图在多个线程中使用一个全局 AWS 连接。这是 Sidekiq 和 DJ 之间最大的区别:你的代码必须是线程安全的。切换到连接池。
https://github.com/mperham/sidekiq/wiki/Advanced-Options#connection-pooling
我们正在从 DelayedJob 迁移到 Sidekiq。一切似乎都很好,只是我们使用亚马逊的 SES 发送电子邮件。我认为这个问题是线程安全问题之一。
每当我们排队超过 1 封电子邮件时,我们都会遇到大量此类错误
WARN EmailJob::perform IOError closed stream #<SendMailQueueItemWorker:0x00007f7fb00b7ae8 @jid="242cafc31a55b6121959103f"> /usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:176:in `wait_readable'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:124:in `read'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:291:in `block in read_body_0'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:276:in `inflater'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:281:in `read_body_0'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http/response.rb:202:in `read_body'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1408:in `block in send_entity'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/gems/aws-sdk-core-3.22.1/lib/seahorse/client/net_http/patches.rb:40:in `block in new_transport_request'
或
EmailJob::perform OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=unknown state: unexpected record #<SendMailQueueItemWorker:0x000055c08033f748 @jid="47a8cdc65878dcaa9e6ad817"> /usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:44:in `connect_nonblock'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:928:in `connect'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:852:in `start'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1384:in `request'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1407:in `send_entity'
/usr/local/rubies/2.3.7/lib/ruby/2.3.0/net/http.rb:1195:in `post'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/bundler/gems/aws-ses-feac6b6b069d/lib/aws/ses/base.rb:165:in `request'
/mnt/xxx-production/shared/bundle/ruby/2.3.0/bundler/gems/aws-ses-feac6b6b069d/lib/aws/ses/send_email.rb:103:in `send_raw_email'
该代码与多年来从 DelayedJob 内部调用的代码完全相同,没有问题。
这里有什么我们可以做的吗,还是我们回去找 DJ 打亚马逊相关的电话?我们多次调用不同的亚马逊服务。
听起来您正试图在多个线程中使用一个全局 AWS 连接。这是 Sidekiq 和 DJ 之间最大的区别:你的代码必须是线程安全的。切换到连接池。
https://github.com/mperham/sidekiq/wiki/Advanced-Options#connection-pooling