FROM CACHE - jp_header

APIを通した大量データの処理時間改善について

soutetsu
観光客
3 0 0

カスタムアプリで、大量の注文データの中から特定の商品(バリエーション)を含むものを検索する機能を開発しています。

カスタムアプリの開発環境は以下の通りです。

  • Ruby on Rails v6.0.3 + shopify_api gem v9.2.0

以下のコードの通り、REST API を通して Order を大量に取得し、それぞれの Order の LineItem に検索したバリエーションが含まれるかどうかを走査するという実装を行いました。

 

class Order < ShopifyAPI::Order
  MAX_ORDER_LIMIT_PER_PAGE = 250

  class << self
    def all_pages(per_page = Order::MAX_ORDER_LIMIT_PER_PAGE)
      all_orders = []
      page = 1
      orders = Order.find(:all, params: {limit: per_page})
        all_orders << orders
        while orders.next_page?
        page += 1
        orders = orders.fetch_next_page
        all_orders << orders
    end
    all_orders.flatten
  end

  # !! このメソッドが遅い
  def find_by_variant_id(variant_id)
    orders = []
    Order.all_pages.each do |order|
      if order.paid?
        if order.line_items.find { |line_item|
          line_item.variant_id == variant_id.to_i
        }
          orders << order
      end
     end
   end
   orders
 end
end

 

上記コードの処理速度がかなり遅く(数十件注文のデータの検索に、数十秒かかる)、困っています。

数十から数百の注文データから特定商品を含むデータを検索するにあたって、より良いコードの書き方があれば、教えていただけると有り難いです。

 

 

4件の返信4

junichiokamura
Community Manager
1200 280 506
soutetsu
観光客
3 0 0

@junichiokamura さん、ご回答ありがとうございます。

GraphQL も試しに使ってみたのですが、「ある商品(Variant)を、明細(lineItems)含む注文(Order)」を1リクエストで処理できなかった事もあり、期待していたほど速度が出ず、もあきらかけていました。

ただ、BulkOperation については知りませんでした。

教えていただいてありがとうございます!

少なくとも、これでリクエストのタイムアウトは防げそうな気がしました。

試してみます。

 

junichiokamura
Community Manager
1200 280 506

なるほど。

扱っているデータは違いますが、以下のようなブログもあるので参考にしてみてください。

https://www.shopify.jp/blog/partner-graphql-shopify-metafields

 

Senior Partner Solutions Engineer
soutetsu
観光客
3 0 0

様々な情報を共有していただき、ありがとうございます!

上のブログの記事も参考にさせていただきます!!