Rails 中的 Redis 与类变量



我在Rails中使用Sidekiq,Redis,Websocket-rails。与sidekiq具有服务器端类。现在,在添加更多功能时,我不能再在 Sidekiq 类的方法中使用实例变量,我需要在方法之间共享信息。Sidekiq 类也继承自 Websocket 类,成为可用的 websocket。
现在,我有 2000/每秒的对象数据更改。使用 95% 的实例变量,5% 从 Redis 推送/获取,以降低 I/O。
我正在考虑使用类变量或在 Redis 上制作所有 100%。我不确定,否则它不会因大数据传输计数而使我的后台作业过载,每个新客户端都会更大。我正在使用 heroku 免费 Dyno,还不想购买更好的服务器。但是使用类变量会减少I/O,并且可能不安全,因为它继承自Websocket-rails?我做这个项目的部分原因是向雇主展示一些东西,我可以编程,以获得我的第一份 IT 工作。我关心他们如何对这些类变量做出反应。雇主会对阶级变量怎么说?选择哪一个?

您绝对可以在 Sidekiq worker 中使用实例变量。 不能使用类或类实例变量。

class MyWorker
  include Sidekiq::Worker
  def perform(a, b)
    @a = a # instance variable, no problem!
    @@a = a # class variable, big problem!
    self.set_a(a)
  end
  def self.set_a(a)
    @a = a  # class instance variable, big problem!
  end
end

类变量有它们的位置,如果它们代表一个不可更改的概念,并且应该作为某物的定义存在,比如整个应用程序的配置,或者应用程序域/业务的一部分的某个基本乘数。

但是,仅仅因为事物是不变的,这并不意味着它们必须是类变量。可以始终使用相同的值设置类的实例,然后共享该实例。有点像单例,但不一定是单例,只是一个广泛共享的变量,它是给定过程开始时输入的一部分。

因此,与其使用 Sidekiq 来存储这个不变的东西的数据,而不是使用类变量,不如通过执行类似操作来实现更简洁的设计。

class ImportantThing
  def initialize(name, other_property)
    @name = name
    @other_property = other_property
  end
  # Other methods you wish to define the behavior of the thing
end

然后你可以

the_important_thing = ImportantThing.new("foobar", 3.46)
do_important_process(the_important_thing)

那么就您正在运行的重要进程而言,重要的是任何表现得像重要事物的东西,无论是全局设置还是不变都无关紧要。

这使得架构易于测试,这通常是清晰和解耦设计的标志。

相关内容

  • 没有找到相关文章

最新更新