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

7rtdyuoh  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(103)

我正在开发一个scraper,它可以浏览网站并在Sidekiq worker中解析其中的特定部分。想象一下,当scraper访问一个包含10个我感兴趣的元素的网站时,每个元素都在Sidekiq中排队。现在我将元素的源代码作为参数传递,稍后将加载到Nokogiri中。我的问题是-将一个巨大的字符串作为参数传递给Sidekiq worker是个好主意吗?字符串的长度总是在77,000 - 80,000个字符之间,所以它真的很大。或者我应该把它存储在一个临时表中,然后在Nokogiri加载之前找到特定的记录?

nhaq1z21

nhaq1z211#

我建议将字符串存储在S3(或任何其他对象存储)上,并使用返回的URL来获取字符串并处理作业。
这样你就可以确保一个小型的Redis服务器可以支持许多并发的sidekiq作业,并且不会耗尽RAM。

zpgglvta

zpgglvta2#

正如其他人评论的那样,最好让你的worker参数尽可能小。你应该传递你的worker完成任务所需的最小可能数据。如果您使用的是Sidekiq,您可能需要考虑内存大小。请参阅sidekiq内存使用重置
根据并发性,存储大型字符串对象可能会成为内存问题。你可以在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

更新:
如果你想检查非字符串数据(如哈希)的内存大小,你可以使用如下方法:

hash = {key: str};
ObjectSpace.memsize_of(hash.to_s)
=> 131112

相关问题