当前位置: 首页 > 面试题库 >

使用sidekiq处理两个单独的Redis实例?

蔡楚
2023-03-14
问题内容

下午好,

我有两个单独的但相关的应用程序。它们都应具有自己的后台队列 (请参阅:独立的Sidekiq和Redis进程)
。但是,我偶尔希望能够将作业app2从推送到的队列中app1

从简单的队列/推送角度来看,如果app1没有现有的Sidekiq / Redis堆栈,则很容易做到这一点:

# In a process, far far away

# Configure client 
Sidekiq.configure_client do |config|
  config.redis = { :url => 'redis://redis.example.com:7372/12', :namespace => 'mynamespace' }
end

# Push jobs without class definition 
Sidekiq::Client.push('class' => 'Example::Workers::Trace', 'args' => ['hello!'])

# Push jobs overriding default's 
Sidekiq::Client.push('queue' => 'example', 'retry' => 3, 'class' =>     'Example::Workers::Trace', 'args' => ['hello!'])

但是,考虑到我本来会调用a Sidekiq.configure_clientSidekiq.configure_serverfrom
app1,那么在这之间可能需要一步。

显然,我可以直接从Sidekiq内部获取序列化和规范化html" target="_blank">代码,然后手动将其推送到app2的redis队列中,但这似乎是一种脆弱的解决方案。我希望能够使用该Client.push功能。

我想理想的解决方案是:

SidekiqTWO.configure_client { remote connection..... }
SidekiqTWO::Client.push(job....)

甚至:

$redis_remote = remote_connection.....

Sidekiq::Client.push(job, $redis_remote)

显然有点滑稽,但这是我理想的用例。

谢谢!


问题答案:

因此,有一件事是,根据FAQ,“ Sidekiq消息格式非常简单且 稳定 :它只是JSON格式的哈希”。强调我的想法-
我认为将JSON发送到sidekiq并不容易。尤其是当您想要精细地控制将作业发送到哪个Redis实例时(例如在OP的情况下),我可能只需要编写一个小的包装即可让我指示Redis实例以及要排队的作业。

对于凯文·比德尔的更普遍的情况,循环作业到Redis的情况下,我想你 不要 它希望有控制的Redis实例used–
你只是想排队,并有分布自动管理。到目前为止,似乎只有一个人要求这样做,他们提出了一个使用Redis::Distributed以下解决方案的解决方案:

datastore_config = YAML.load(ERB.new(File.read(File.join(Rails.root, "config", "redis.yml"))).result)

datastore_config = datastore_config["defaults"].merge(datastore_config[::Rails.env])

if datastore_config[:host].is_a?(Array)
  if datastore_config[:host].length == 1
    datastore_config[:host] = datastore_config[:host].first
  else
    datastore_config = datastore_config[:host].map do |host|
      host_has_port = host =~ /:\d+\z/

      if host_has_port
        "redis://#{host}/#{datastore_config[:db] || 0}"
      else
        "redis://#{host}:#{datastore_config[:port] || 6379}/#{datastore_config[:db] || 0}"
      end
    end
  end
end

Sidekiq.configure_server do |config|
  config.redis = ::ConnectionPool.new(:size => Sidekiq.options[:concurrency] + 2, :timeout => 2) do
    redis = if datastore_config.is_a? Array
      Redis::Distributed.new(datastore_config)
    else
      Redis.new(datastore_config)
    end

    Redis::Namespace.new('resque', :redis => redis)
  end
end

另一件事是在你的追求考虑,以获得高可用性和故障转移是让Sidekiq专业,其中包括可靠性的特点:“该Sidekiq专业客户能承受瞬时Redis的中断将本地排队工作时的错误,并尝试提供这些就业机会。连接恢复后。”
由于sidekiq始终用于后台进程,因此,如果Redis实例发生故障,则短暂的延迟不会影响您的应用程序。如果您的两个Redis实例之一发生故障并且正在使用轮询,则除非使用此功能,否则您仍然会丢失一些工作。



 类似资料:
  • 问题内容: 我用来将后台作业处理到我们的Rails项目之一中。我们要使用位于不同位置的其他Redis服务器来与其他后台处理作业分开。 根据Sidekiq配置wiki,我们可以像 config / initializers / sidekiq.rb 但是,如何初始化与多个Redis服务器的连接? 问题答案: Sidekiq 2不支持多个Redis服务器,请升级到仅在今天发布的sidekiq 3,并添

  • 问题内容: Sidekiq可以阻止哪些可能的原因来处理队列中的作业?队列已满。日志文件表明完全没有活动。因此,队列已满,但日志为空,Sidekiq似乎未处理项目。似乎没有工人在处理工作。重新启动Redis或用FLUSHALL或FLUSHDB冲洗均无效。Sidekiq已开始于 捆绑执行程序sidekiq -L log / sidekiq.log 并生成以下日志文​​件: 您如何找出问题所在?是否有隐

  • 问题内容: 我在铁路上使用sidekiq发送电子邮件。我为redis服务器添加了密码,但是似乎无法正确输入密码,因为我遇到了错误 我的sidekiq日志显示应该可以吗? 这是我在初始化程序中的sidekiq.rb 问题答案: 您需要在服务器和客户端块中都配置Redis,如使用Redis wiki页面中所述 。

  • 我目前正在使用Android Room在Android上存储一些小数据。理论上,我使用allowMainThreadQueries()应该没有问题,因为我的所有数据都很小,但为了将来证明我的程序,我尝试将所有调用移动到一个单独的线程中。到目前为止,我在AppConfig中有一个静态处理程序,该类在应用程序初始启动时初始化,在应用程序范围内可见: DbHandler是一个扩展Handler的自定义类

  • 我正在浏览ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue分别有一个putLock和一个takeLock,用于插入和删除,但是ArrayBlockingQueue只使用一个锁。我相信LinkedBlockingQueue是基于简单、快速和实用的非阻塞和阻塞并发队列算法中描述的设计实现的。在本文中,它们提到了保留一个虚拟节点

  • 问题内容: 我有以下两个软件包: com.mycorp.project.first com.mycorp.project.second 我想配置Log4J(SLF4J),以将日志从一个包写入一个文件,而从另一个包写入第二个文件。我不希望它们混在一起。 需要明确的是,这是一个正在运行的项目/一个进程。 我已经尝试使用过滤器和记录器,但是log4j似乎忽略了它们。这两个文件始终相同。 编辑:到目前为止