我想在我的應用程序獲得一些重要的負載時將我的Rails應用程序切換到Sidekiq和Puma。但是,它們需要應用程序是線程安全的。如何擁有線程安全的Rails初始化器?
通常被認爲不是線程安全的事情之一是全局變量。但是我的應用程序將使用Rails應用和教程發現了一個共同的模式,讓您在初始化定義全局變量,像這樣:
# config/initializers/aws.rb
...
$s3_bucket = Aws::S3::Resource.new.bucket(ENV['AWS_S3_BUCKET'])
# config/initializers/mixpanel.rb
$mixpanel = Mixpanel::Tracker.new(ENV['MIXPANEL_TOKEN']) do |*message|
...
end
# config/initializers/redis.rb
$redis = Redis.new(host: ENV['REDIS_HOST'], port: ENV['REDIS_PORT'])
# config/initializers/twilio.rb
$twilio_client = Twilio::REST::Client.new(ENV['TWILIO_ACCOUNT_SID'], ENV['TWILIO_AUTH_TOKEN'])
我喜歡這種方法,因爲代碼庫的其他部分可以很容易地使用這些變量,它使它變得更加爽朗。
但是這些全局變量是線程安全的嗎?如果不是,我有什麼選擇?我最好使用一個仍然保持代碼庫容易閱讀的解決方案。
關於Twitter中同一主題的討論gem repo https://github.com/sferik/twitter/issues/131 –