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

问题描述 投票:0回答:2

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

ruby-on-rails ruby nokogiri sidekiq
2个回答
5
投票

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

这样您就可以确保小型 Redis 服务器可以支持许多并发 sidekiq 作业,并且不会耗尽 RAM。


2
投票

正如其他人评论的那样,最好使您的工作参数尽可能小。您应该传递工作人员完成其任务所需的尽可能少的数据。如果您使用 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
© www.soinside.com 2019 - 2024. All rights reserved.