3

Herokou と Redis で、携帯電話番号を含む入力 CSV ファイルのすべての行に対して SMS メッセージを送信するアプリを構築しています。sidekiqメッセージは、以下に示すワーカーで Twilio を使用して送信されます。問題は、SMS が CSV のすべての行に対して送信されているにもかかわらず、データベースの write (TextMessage.create)および log write (putsステートメント)が CSV の1 つの行に対してのみ実行されることです。CSV の各行に対して 1 つの Sidekiq ワーカーが生成されます。 I/O (DB、ファイル) アクセス権を持つ Sidekiq ワーカーは 1 つだけのようで、他の Sidekiq ワーカーからはロックされています。

sidekiq ワーカー:

require 'sidekiq'
require 'twilio-rb'

class TextMessage < ActiveRecord::Base
    include Sidekiq::Extensions

    def self.send_message(number, body, row_index, column_index, table_id)
        puts "TextMessage#send_message: ROW INDEX: #{row_index} COLUMN INDEX: #{column_index} TABLEID: #{table_id} BODY: #{body} PHONE: #{number}"

        Twilio::Config.setup :account_sid  => 'obfuscated', :auth_token   => '<obfuscated>'
    sms = Twilio::SMS.create :to => number, :from => '+17085555555', :body => body +  ' | Sent: ' + Time.now.in_time_zone('Central Time (US & Canada)').strftime("%m/%d/%Y %I:%M%p Central")
        TextMessage.create :to => number, :from => '+17085555555'
        ImportCell.add_new_column(table_id, row_index, column_index, "Time Sent", Time.now.in_time_zone('Central Time (US & Canada)').strftime("%m/%d/%Y %I:%M%p Central"))
    end
end

sidekiq ワーカーへの呼び出し:

 TextMessage.delay_until(time_to_send, :retry => 3).send_message(phone, 'Scheduled: ' + time_to_send.in_time_zone('Central Time (US & Canada)').strftime("%m/%d/%Y %I:%M%p Central"), row_index, column_index, table.id)
      column_index += 1  

ヘロクProcfile

worker: bundle exec sidekiq -C config/sidekiq.yml

sidekiq.yml

:verbose: false
:concurrency:  3
:queues:
  - [default, 5]

config/initializers/redis.rb:

uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)

Sidekiq.configure_server do |config|
 database_url = ENV['DATABASE_URL']
 if(database_url)
   ENV['DATABASE_URL'] = "#{database_url}?pool=25"
   ActiveRecord::Base.establish_connection
  end
end
4

1 に答える 1

2

私はあなたの質問にコメントした人の 1 人です。

SideKiq が気に入らなかった .create を使用しているので、.new を使用してから .save を使用してみました。.create がスレッドセーフではないか、そのようなものに関係していると思いますが、正直なところわかりません。

非作業コード:

class HardWorker
    include Sidekiq::Worker

    def perform(name, count)
        puts 'Doing some hard work!'

        UserInfo.create(
         :user => "someone",
         :misc1 => 0,
         :misc2 => 0,
         :misc3 => 0,
         :comment => "Made from HardWorker",
         :time_changed => Time.now
        )

        puts 'Done with hard work!'
    end
end

作業コード:

class HardWorker
    include Sidekiq::Worker

    def perform(name, count)
        puts 'Doing some hard work!'

        a_row = UserInfo.new(
         :user => "someone",
         :misc1 => 0,
         :misc2 => 0,
         :misc3 => 0,
         :comment => "Made from HardWorker",
         :time_changed => Time.now
        )

        a_row.save

        puts 'Done with hard work!'
    end
end
于 2013-07-11T04:50:10.367 に答える