将一个巨大的字符串作为参数传递给Sidekiq工作者是一个好主意吗?

时间:2018-04-14 12:08:21

标签: ruby-on-rails ruby nokogiri sidekiq

我正在研究一个剪贴板,它通过网站并解析Sidekiq工作人员的特定部分。想象一下当刮板访问一个包含我感兴趣的10个元素并且每个元素都在Sidekiq排队的网站时的情况。目前,我将元素的源代码作为参数传递,后来在Nokogiri中加载。我的问题是 - 将一个巨大的字符串作为参数传递给Sidekiq工作者是一个好主意吗?字符串长度始终在77,000-80,000个字符之间,所以它真的很大。或者我应该将它存储在临时表中并在Nokogiri加载之前找到特定记录?

2 个答案:

答案 0 :(得分:1)

我建议将字符串存储在S3(或任何其他对象存储)上,并使用返回的URL来获取字符串并处理作业。

通过这种方式,您可以确保小型Redis服务器可以支持多个并发的sidekiq作业,并且不会超出RAM。

答案 1 :(得分:0)

正如其他人所评论的那样,最好让你的工人尽可能小。您应该传递工作人员完成任务所需的最小可能数据。如果您使用Sidekiq,则可能需要考虑内存大小。见sidekiq memory usage reset

根据并发性,存储大型字符串对象可能会成为内存问题。 您可以在ruby中了解字符串内存大小的内存:

require 'securerandom'
require 'objspace'

str = SecureRandom.hex(40000) # generate a random 80k length string
ObjectSpace.memsize_of(str) #=> 80041 # < 1 MB for your example