gpt4 book ai didi

ruby-on-rails - Sidekiq 工作人员无法写入数据库或日志文件

转载 作者:IT王子 更新时间:2023-10-29 06:02:34 25 4
gpt4 key购买 nike

我正在 Herokou 和 Redis 上构建一个应用程序,它为包含手机号码的输入 CSV 文件中的每一行发送一条 SMS 消息。该消息是在如下所示的 sidekiq worker 中使用 Twilio 发送的。问题是,即使正在为 CSV 中的所有行发送 SMS,数据库写入(TextMessage.create) 和日志写入(puts 语句)只执行对于 CSV 中的 one 行。 CSV 文件中的每一行都会生成一个 Sidekiq worker。似乎只有一个 Sidekiq 工作人员具有 I/O(数据库、文件)访问权限,并且它锁定了其他 Sidekiq 工作人员。任何帮助将不胜感激。

sidekiq worker :

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 worker:

 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

Heroku 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

最佳答案

我是对您的问题发表评论的人之一,刚刚解决了它!

您正在使用 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

关于ruby-on-rails - Sidekiq 工作人员无法写入数据库或日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com