快速将24000种单变化产品导入Shopify

时间:2014-09-22 15:41:50

标签: ruby api rest shopify

我想每天晚上04:00将~24000(单一变化)产品导入Shopify。

默认Admin > Products > Import > CSV方法的问题是,完成时间过长了不可接受的时间。所以我开始使用Shopify API使用Ruby gem

Shopify API的API调用限制为每秒2次呼叫,一次可以突发40次呼叫。您可以阅读有关API调用限制here的更多信息。我不明白“一次爆40次电话的空间”部分。

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

  

如果您要制作包含该产品的产品创建API请求   其中的变体信息(假设每个产品有3个变体)和   使用默认API限制(刷新每秒2个请求,或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 '========================================================================='

但是我没有在67分钟左右到达任何地方。

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

我可以尝试加快速度吗?

2 个答案:

答案 0 :(得分:1)

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

由于单个产品需要大约3秒钟才能导入,我的解决方案是有5个工作人员(线程)运行产品导入并检查429个错误。如果他们达到429,他们会暂停10秒然后重试。目前进口~26000产品需要约3,6小时。

答案 1 :(得分:0)

这里的另一个选择是避免限制请求,直到您开始从shopify中达到速率限制错误。这可以确保您正在利用突发限制,并且仅在Shopify API对您进行速率限制时暂停。

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

https://github.com/iloveitaly/shopify_api_extensions/

我相信Shopify还可以选择提高你的价格限制。联系他们的支持,看看他们是否可以提高您帐户的限额。