Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 向Shopify导入24000个单一变体产品的快速方法_Ruby_Api_Rest_Shopify - Fatal编程技术网

Ruby 向Shopify导入24000个单一变体产品的快速方法

Ruby 向Shopify导入24000个单一变体产品的快速方法,ruby,api,rest,shopify,Ruby,Api,Rest,Shopify,我想每天晚上4:00进口约24000种(单一变体)产品到Shopify 默认的Admin>Products>Import>CSV方法的问题是,它需要很长时间才能完成。所以我开始使用他们的 ShopifAPI的API调用限制为每秒2次,一次可容纳40次的突发调用。您可以阅读有关API调用限制的更多信息。我不明白“一次可以打40个电话”的部分 Shopify的一名员工告诉我有关通过API导入产品的以下信息: 如果您要发出包含以下内容的产品创建API请求: 其中的变体信息(假设每个产品有3个变体)和

我想每天晚上4:00进口约24000种(单一变体)产品到Shopify

默认的
Admin>Products>Import>CSV
方法的问题是,它需要很长时间才能完成。所以我开始使用他们的

ShopifAPI的API调用限制为每秒2次,一次可容纳40次的突发调用。您可以阅读有关API调用限制的更多信息。我不明白“一次可以打40个电话”的部分

Shopify的一名员工告诉我有关通过API导入产品的以下信息:

如果您要发出包含以下内容的产品创建API请求: 其中的变体信息(假设每个产品有3个变体)和 使用默认API限制(每秒刷新2个请求,或 并发请求)您可能可以完成所有这些请求的创建 约67分钟内完成所有产品

我编写了以下Ruby脚本将所有产品导入Shopify:

require 'shopify_api'
require 'open-uri'
require 'json'

begin_time = Time.now

shop_url  = "https://<API_KEY>:<PASSWORD>@<SHOPNAME>.myshopify.com/admin"

ShopifyAPI::Base.site = shop_url

raw_product_data = JSON.parse(open('<LINK>') {|f| f.read }.force_encoding('UTF-8'))
raw_product_data_size = raw_product_data.size

puts '========================================================================='
puts "#{raw_product_data_size} products loaded. Starting import now..."
puts '-------------------------------------------------------------------------'

raw_product_data.each_with_index do |item, index|
  single_product_begin_time = Time.now

  # Store item data in variables
  <DATA>

  # Create new product
  new_product = ShopifyAPI::Product.new
  new_product.title = title
  new_product.body_html = body
  new_product.product_type = type
  new_product.vendor = vendor
  new_product.tags = tags

  new_product.variants = [
    {
      "option_1" => "First",
      "price" => variant_price,
      "sku" => variant_sku
    }
  ]

  new_product.images = [
    {
      src: image_src
    }
  ]

  new_product.save

  creation_time = Time.now - single_product_begin_time

  puts "#{((index / raw_product_data_size.to_f) * 100).round(2)}% - #{index} - #{variant_sku} added in #{creation_time.round(2)} seconds"
end

puts '-------------------------------------------------------------------------'
puts "Done. It took #{begin_time - Time.now} minutes."
puts '========================================================================='
要求“shopify\u api”
需要“打开uri”
需要“json”
开始时间=现在
shop_url=“https://:@.myshopify.com/admin”
ShopifyAPI::Base.site=shop\u url
原始产品数据=JSON.parse(open(“”){f | f.read}.force_编码('UTF-8'))
原始产品数据大小=原始产品数据大小
放入“=================================================================================================================================
将“#{raw_product_data_size}产品加载。现在开始导入…”
放置“--------------------------------------------------------------”
原始产品数据。每个带有索引do的项目,索引|
单个产品开始时间=时间。立即
#将项目数据存储在变量中
#创造新产品
new_product=shoppifyAPI::product.new
new_product.title=标题
new_product.body_html=body
新产品。产品类型=类型
新产品供应商=供应商
新产品标签=标签
新产品。变体=[
{
“选项1”=>“第一”,
“价格”=>变量价格,
“sku”=>变体\u sku
}
]
新产品图片=[
{
src:image\u src
}
]
新产品。保存
创建时间=time.now-单个产品开始时间
将“#{((索引/原始产品数据大小到f)*100).round(2)}%-#{index}-#{variant_sku}添加到#{creation_time.round(2)}秒”
结束
放置“--------------------------------------------------------------”
“完成了,花了{开始时间-时间,现在}分钟。”
放入“=================================================================================================================================
但我没有接近67分钟

目前,添加单个产品大约需要3秒钟。按照这个速度,添加24000个产品需要20个小时。这是不能接受的。2小时内的一切都可以接受


我可以试着加快速度吗?

简短而甜蜜的回答,使用多线程


由于导入单个产品需要约3秒钟的时间,因此我的解决方案是让5个工人(线程)运行产品导入并检查429个错误。如果遇到429,则暂停10秒钟,然后重试。目前进口26000件产品需要3,6小时

这里的另一个选项是避免限制请求,直到您开始遇到shopify的速率限制错误。这可以确保您充分利用突发限制,并且仅当Shopify API限制您的速率时才暂停

我编写了一个gem,它可以检测
429
错误(以及其他网络错误),并根据指数退避计划自动重试


我相信Shopify也可以选择提高您的费率限制。联系他们的支持人员,看看他们是否可以提高您帐户的限制。

这可能是因为他们在与常规web应用程序相同的服务器上托管API,速度很慢,而且可能超卖*10。