【问题标题】:Is it a good idea to pass a huge string as an argument to Sidekiq worker?将一个巨大的字符串作为参数传递给 Sidekiq 工作人员是一个好主意吗?
【发布时间】:2018-04-14 12:08:20
【问题描述】:

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

【问题讨论】:

  • 您为什么不尝试测试每种方法的性能?
  • Best Practices“让你的工作参数小而简单”
  • 为什么需要存储大字符串?工人不能在运行时提取该数据吗?即进行 api 调用,解析所需内容并完成其目的?

标签: ruby-on-rails ruby nokogiri sidekiq


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我开始实现一个中间件,它会在 Sidekiq 工作人员参数中报告内存违规。但后来我遇到了一个问题,即当 perform() 的参数是 Hash、Array 和其他复杂数据类型时会发生什么。然后它总是给我一个固定的大小。
    猜你喜欢
    • 2016-08-12
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多